re.sub reemplazar demasiado texto

Tengo un conjunto de enlaces como:

['http://www.nytimes.com/2016/12/31/us/politics/house-republicans-health-care-suit.html?partner=rss&emc=rss" rel="standout">', 'http://www.nytimes.com/2016/12/31/nyregion/bronx-murder-40th-precinct-police-residents.html', 'http://www.nytimes.com/2016/12/30/movies/tyrus-wong-dies-bambi-disney.html?partner=rss&emc=rss', 'http://www.nytimes.com/2016/12/30/obituaries/among-deaths-in-2016-a-heavy-toll-in-pop-music.html', 'http://www.nytimes.com/video/world/100000004830728/daybreak-around-the-world.html?partner=rss&emc=rss'] 

Estoy tratando de iterar sobre ellos para eliminar todo lo que viene después de html . Así que tengo:

 cleanitems = [] for item in links: cleanitems.append(re.sub(r'html(.*)', '', item)) 

Que devuelve:

 ['http://www.nytimes.com/2016/12/31/us/politics/house-republicans-health-care-suit.', 'http://www.nytimes.com/2016/12/31/nyregion/bronx-murder-40th-precinct-police-residents.', 'http://www.nytimes.com/2016/12/30/movies/tyrus-wong-dies-bambi-disney.', 'http://www.nytimes.com/2016/12/30/obituaries/among-deaths-in-2016-a-heavy-toll-in-pop-music.', 'http://www.nytimes.com/video/world/100000004830728/daybreak-around-the-world.] 

Confundido en cuanto a por qué está incluyendo html en el grupo de captura. Gracias por cualquier ayuda.

html forma parte del texto coincidente, no solo del grupo (...) . re.sub() reemplaza todo el texto combinado completo.

Incluya el texto literal html en el reemplazo:

 cleanitems.append(re.sub(r'html(.*)', 'html', item)) 

o, alternativamente, captura esa parte en un grupo en su lugar:

 cleanitems.append(re.sub(r'(html).*', r'\1', item)) 

Es posible que desee considerar el uso de una coincidencia no codiciosa y un ancla de $ fin de cadena para evitar cortar una URL que contiene html en la ruta más de una vez, e incluir la . punto para asegurarse de que realmente solo coincida con la extensión .html :

 cleanitems.append(re.sub(r'\.html.*?$', r'.html', item)) 

Sin embargo, si su objective es eliminar la cadena de consulta de una URL, considere analizar la URL usando urllib.parse.urlparse() , y vuelva a urllib.parse.urlparse() sin la cadena de consulta o los identificadores de fragmentos:

 from urlib.parse import urlparse cleanitems.append(urlparse(item)._replace(query='', fragment='').geturl()) 

Sin embargo, esto no eliminará los fragmentos HTML erróneos; Si está analizando estas URL de un documento HTML, considere usar un analizador HTML real en lugar de expresiones regulares.

Solo un complemento a la respuesta de Martijn.

También puede usar una aserción de búsqueda para que solo coincida con el texto que sigue a html :

 cleanitems.append(re.sub(r'(?<=html).*', '', item)) 

o use una cadena de reemplazo para mantener la parte inicial:

 cleanitems.append(re.sub(r'(html).*', r'\1', item)) 

Pero como ya dijo Martin, es mejor que uses el módulo urllib para analizar correctamente las URL