How to match this regex to extract the following pattern? - python

I have a large string that has an id and two words in spanish:
large__string = '''
Vaya ir VMM03S0 0.427083
mañanita mañana RG 0.796611
, , Fc 1
buscando buscar VMG0000 1
una uno DI0FS0 0.951575
lavadora lavadora NCFS000 0.414738
con con SPS00 1
la el DA0FS0 0.972269
que que PR0CN000 0.562517
sorprender sorprender VMN0000 1
a a SPS00 0.996023
una uno DI0FS0 0.951575
persona persona NCFS000 0.98773
muy muy RG 1
especial especial AQ0CS0 1
para para SPS00 0.999103
nosotros nosotros PP1MP000 1
, , Fc 1
y y CC 0.999962
la lo PP3FSA00 0.0277039
encontramos encontrar VMIP1P0 0.65
. . Fp 1
Pero pero CC 0.999764
vamos ir VMIP1P0 0.655914
a a SPS00 0.996023
lo el DA0NS0 0.457533
que que PR0CN000 0.562517
ninguna ninguno DI0S3DF 0.345344
error error A3FSD23 1
interesa interesar VMIP3S0 0.994868
LO_QUE_INTERESA_La lo_que_interesa_la NP00000 1
lavadora lavador AQ0FS0 0.585262
tiene tener VMIP3S0 1
una uno DI0FS0 0.951575
clasificación clasificación NCFS000 1
A+ a+ NP00000 1
, , Fc 1
de de SPS00 0.999984
las el DA0FP0 0.970954
que que PR0CN000 0.562517
ahorran ahorrar VMIP3P0 1
energía energía NCFS000 1
, , Fc 1
si si CS 0.99954
no no RN 0.998134
me me PP1CS000 0.89124
equivoco equivocar VMIP1S0 1
. . Fp 1
Lava lavar VMIP3S0 0.397388
hasta hasta SPS00 0.957698
7 7 Z 1
kg kilogramo NCMN000 1
, , Fc 1
no no RN 0.998134
está estar VAIP3S0 0.999201
nada nada RG 0.135196
mal mal RG 0.497537
, , Fc 1
se se P00CN000 0.465639
le le PP3CSD00 1
veía ver VMII3S0 0.62272
un uno DI0MS0 0.987295
gran gran AQ0CS0 1
tambor tambor NCMS000 1
( ( Fpa 1
de de SPS00 0.999984
acero acero NCMS000 0.973481
inoxidable inoxidable AQ0CS0 1
) ) Fpt 1
y y CC 0.999962
un uno DI0MS0 0.987295
consumo consumo NCMS000 0.948927
máximo máximo AQ0MS0 0.986111
de de SPS00 0.999984
49 49 Z 1
litros litro NCMP000 1
Mandos mandos NP00000 1
intuitivos intuitivo AQ0MP0 1
, , Fc 1
todo todo PI0MS000 0.43165
muy muy RG 1
bien bien RG 0.902728
explicado explicar VMP00SM 1
, , Fc 1
nada nada PI0CS000 0.850279
que que PR0CN000 0.562517
ver ver VMN0000 0.997382
con con SPS00 1
la el DA0FS0 0.972269
lavadora lavadora NCFS000 0.414738
de de SPS00 0.999984
casa casa NCFS000 0.979058
de de SPS00 0.999984
mis mi DP1CPS 0.995868
padres padre NCMP000 1
Además además NP00000 1
incluye incluir VMIP3S0 0.994868
la el DA0FS0 0.972269
tecnología tecnología NCFS000 1
Textileprotec textileprotec NP00000 1
que que PR0CN000 0.562517
protege proteger VMIP3S0 0.994868
nuestras nuestro DP1FPP 0.994186
ninguna ninguno DI0S3DF 0.345344
falla falla NCFSD23 1
prendas prenda NCFP000 0.95625
más más RG 1
preciadas preciar VMP00PF 1
. . Fp 1'''
I would like to extract in a list ninguno followed by the id (to the right) and the second word that have as id NC_ _ _ _ _. Where _ _ _ _ _ are free characters of the id, they must be consecutive (i.e. they must have this precedence ninguno followed by NC, they must be "together"). For example let's focus in this pattern:
ninguna ninguno DI0S3DF 0.345344
falla falla NCFSD23 1
for large__string I would like to extract this as:
[('ninguno', 'DI0S3DF'), ('falla', 'NCFSD23')]
This is what I tried:
pattern__ = re.findall(r'^(\w+)\s.+\s(ninguno)\s[0-9.]+\n^(.+)\s.+\s(NC)', large__string)
But I get an empty list. The regex is wrong, how can I create a regex that extract the above pattern?. Thanks in advance.

You need to use re.findall method.
>>> s = '''Vaya ir VMM03S0 0.427083
mañanita mañana RG 0.796611
, , Fc 1
buscando buscar VMG0000 1
una uno DI0FS0 0.951575
lavadora lavadora NCFS000 0.414738
con con SPS00 1
la el DA0FS0 0.972269
que que PR0CN000 0.562517
sorprender sorprender VMN0000 1
a a SPS00 0.996023
una uno DI0FS0 0.951575
persona persona NCFS000 0.98773
muy muy RG 1
especial especial AQ0CS0 1
para para SPS00 0.999103
nosotros nosotros PP1MP000 1
, , Fc 1
y y CC 0.999962
la lo PP3FSA00 0.0277039
encontramos encontrar VMIP1P0 0.65
. . Fp 1
Pero pero CC 0.999764
vamos ir VMIP1P0 0.655914
a a SPS00 0.996023
lo el DA0NS0 0.457533
que que PR0CN000 0.562517
interesa interesar VMIP3S0 0.994868
LO_QUE_INTERESA_La lo_que_interesa_la NP00000 1
lavadora lavador AQ0FS0 0.585262
tiene tener VMIP3S0 1
una uno DI0FS0 0.951575
clasificación clasificación NCFS000 1
A+ a+ NP00000 1
, , Fc 1
de de SPS00 0.999984
las el DA0FP0 0.970954
que que PR0CN000 0.562517
ahorran ahorrar VMIP3P0 1
energía energía NCFS000 1
, , Fc 1
si si CS 0.99954
no no RN 0.998134
me me PP1CS000 0.89124
equivoco equivocar VMIP1S0 1
. . Fp 1
Lava lavar VMIP3S0 0.397388
hasta hasta SPS00 0.957698
7 7 Z 1
kg kilogramo NCMN000 1
, , Fc 1
no no RN 0.998134
está estar VAIP3S0 0.999201
nada nada RG 0.135196
mal mal RG 0.497537
, , Fc 1
se se P00CN000 0.465639
le le PP3CSD00 1
veía ver VMII3S0 0.62272
un uno DI0MS0 0.987295
gran gran AQ0CS0 1
tambor tambor NCMS000 1
( ( Fpa 1
de de SPS00 0.999984
acero acero NCMS000 0.973481
inoxidable inoxidable AQ0CS0 1
) ) Fpt 1
y y CC 0.999962
un uno DI0MS0 0.987295
consumo consumo NCMS000 0.948927
máximo máximo AQ0MS0 0.986111
de de SPS00 0.999984
49 49 Z 1
litros litro NCMP000 1
Mandos mandos NP00000 1
intuitivos intuitivo AQ0MP0 1
, , Fc 1
todo todo PI0MS000 0.43165
muy muy RG 1
bien bien RG 0.902728
explicado explicar VMP00SM 1
, , Fc 1
nada nada PI0CS000 0.850279
que que PR0CN000 0.562517
ver ver VMN0000 0.997382
con con SPS00 1
la el DA0FS0 0.972269
lavadora lavadora NCFS000 0.414738
de de SPS00 0.999984
casa casa NCFS000 0.979058
de de SPS00 0.999984
mis mi DP1CPS 0.995868
padres padre NCMP000 1
Además además NP00000 1
incluye incluir VMIP3S0 0.994868
la el DA0FS0 0.972269
tecnología tecnología NCFS000 1
Textileprotec textileprotec NP00000 1
que que PR0CN000 0.562517
protege proteger VMIP3S0 0.994868
nuestras nuestro DP1FPP 0.994186
ninguna ninguno DI0S3DF 0.345344
falla falla NCFSD23 1
prendas prenda NCFP000 0.95625
más más RG 1
preciadas preciar VMP00PF 1
. . Fp 1'''
>>> re.findall(r'(?m)^.*?\b(ninguno)\s+(\S+)\s+[0-9.]+\n.*?\s(\S+)\s+(NC\S+)\s+[0-9.]+$', s)
[('ninguno', 'DI0S3DF', 'falla', 'NCFSD23')]
Regex Demo
Since there are 4 capturing groups used, you must get a list of tuples of 4 items each.

Related

Joining the subtitles with text body of article using beautiful soup

I want to grab the body text of the article which is in p class with subtitles that is in span class but I'm not sure how can I join them(both body text and subtitles). I have joined the body text but subtitles are missing. Im using python and beautiful soup
This is the sample link
Here is how I join the text
response = urllib.request.urlopen(link)
respone_html = response.read().decode()
parsed_html = BeautifulSoup(respone_html, 'html.parser')
page_text = ''
if parsed_html.findAll('div', attrs={'class' : 'articulo-contenido'}) is not None:
texts = parsed_html.findAll('div', attrs={'class' : 'articulo-contenido'})
for text in texts:
textbody = text.findAll('p',attrs={'class' : 'contenido'})
textsubtitle = text.findAll('span',attrs={'class' : 'articulo-subtitulo'})
for p in textbody:
page_text += '\n' + ''.join(p.findAll(text = True))
The output Im getting is the only body text like this
Stephanie Grisham, quien trabajó durante cinco años en diferentes
roles como asesora principal de Donald y Melania Trump, cuenta sus
memorias de aquella época en su libro 'I'll Take Your Questions Now'
(responderé sus preguntas ahora).(Puede leer: EE. UU. teme una
'subversión electoral' con Trump coqueteando con volver). El relato se
publicará el próximo martes, 5 de octubre. Sin embargo, 'CNN' obtuvo
una copia anticipada y reveló algunas descripciones que realiza
Grisham acerca de Melania Trump, quien, para muchos, es la primera
dama más reservada de la historia política estadounidense moderna.
Cabe resaltar que Grisham trabajó como directora de comunicaciones y
jefa de personal de la exprimera dama, por lo que sabe varios de sus
detalles más íntimos.De hecho, 'The Washington Post' se comunicó con
la oficina de Melania Trump para preguntar sobre el libro, la cual
afirmó lo siguiente en una declaración: "La intención detrás de este
libro es obvia. Es un intento de redimirse después de un mal desempeño
como secretaria de prensa, relaciones personales fallidas y
comportamiento poco profesional en la Casa Blanca. A través de la
falsedad y la traición busca ganar relevancia y dinero a expensas de
la señora Trump".(Lea también: Trump tuvo un asistente llamado 'el
hombre de la música' para calmar su ira).Ahora bien, a continuación
podrá saber cinco cosas que se exponen el libro de Grisham sobre la
exprimera dama: Aunque cuando vivía en la Casa Blanca Melania no era
muy expresiva en cuanto a los comentarios que hacían sobre ella,
Grisham comenta que la esposa del expresidente solía leer lo que la
prensa escribía sobre ella. "Como su esposo y todos sus hijos, la Sra.
Trump escudriñó sus recortes de prensa como un arquitecto experto que
se enfoca en planos. No se le pasó por alto ningún detalle, no pasó
nada por alto. Tenía las alertas de Google configuradas para ella y lo
vio todo", escribió la autora del libro.(De interés: Trump demanda a
su sobrina y al NY Times por investigación sobre finanzas). Grisham
comentó que Melania no pasaba mucho tiempo en la espaciosa 'suite' que
se le asignó, sino que solía trabajar desde su casa, mucho antes de
que el covid-19 estuviera presente. Incluso, el Servicio Secreto la
llamaba 'Rapunzel' porque permanecía "en su torre"."Teníamos reuniones
en persona, pero por lo general se llevaban a cabo en la sala de mapas
frente a los ascensores a la residencia. Allí planificaríamos los
horarios, responderíamos a consultas urgentes y discutiríamos los
objetivos", afirmó Grisham.La autora dijo, adicionalmente, que la
exprimera dama dedicaba mucho tiempo a su cuidado personal: "Ella
creía que la relajación era fundamental para el régimen de belleza de
uno, al igual que, por supuesto, los tratamientos de spa y
faciales".(Además: Donald Trump quiso pintar su avión para que se
pareciera al presidencial). De acuerdo con Grisham, había tensión
entre la esposa y la hija de Donald Trump porque Ivanka, quien era
llamada por su madrastra como 'la princesa', tenía el deseo de ser el
centro de atención en los eventos públicos y viajes.Según el escrito
de la exasesora, Melania era una estudiante de protocolo y solía ser
muy rigurosa en cuanto a respetar las tradiciones de los países que
son reservadas solo para un presidente y su cónyuge, no para la hija
del mandatario y su esposo. Cuando en 2018 se divulgaron las
acusaciones de infidelidad de Donald Trump con la actriz porno Stormy
Daniels y la exmodelo de 'Playboy' Karen MacDougal, se dice que
Melania tomó una caravana separada para llegar al discurso del Estado
de la Unión de ese año. Sin embargo, esta información no se
confirmó.No obstante, Grisham dijo que la mujer sí estaba enojada con
su esposo y no quiso exponerse públicamente junto a él."Sentí que la
señora Trump estaba avergonzada, y que quería que él también se
sintiera avergonzado. No sé si él es capaz de eso o no", escribió
Grisham.(Le recomendamos: Capitolio de EE. UU., en alerta por
manifestación de partidarios de Trump). En 2018, la exprimera dama
apareció con una chaqueta verde que decía en la espalda 'Realmente no
me importa. ¿A ti?', durante una visita a un centro de detención de
Texas. Según cuenta la exasesora, posiblemente Melania no sabía las
críticas que iba a recibir por el mensaje de la chaqueta justo cuando
acudía a una causa preocupante para el país en ese momento.Grisham
aseguró, además, que el entonces presidente Donald Trump parecía
molesto por la situación y miro a su esposa para decirle: "¿Qué
diablos estabas pensando?". (Siga leyendo: General de EE.UU. alertó a
China sobre la salud mental de Trump, dice libro).ELTIEMPO.COM
but it should have headings like
Stephanie Grisham, quien trabajó durante cinco años en diferentes roles como asesora principal de Donald y Melania Trump, cuenta sus memorias de aquella época en su libro 'I'll Take Your Questions Now' (responderé sus preguntas ahora).(Puede leer: EE. UU. teme una 'subversión electoral' con Trump coqueteando con volver).
El relato se publicará el próximo martes, 5 de octubre. Sin embargo, 'CNN' obtuvo una copia anticipada y reveló algunas descripciones que realiza Grisham acerca de Melania Trump, quien, para muchos, es la primera dama más reservada de la historia política estadounidense moderna. Cabe resaltar que Grisham trabajó como directora de comunicaciones y jefa de personal de la exprimera dama, por lo que sabe varios de sus detalles más íntimos.De hecho, 'The Washington Post' se comunicó con la oficina de Melania Trump para preguntar sobre el libro, la cual afirmó lo siguiente en una declaración: "La intención detrás de este libro es obvia. Es un intento de redimirse después de un mal desempeño como secretaria de prensa, relaciones personales fallidas y comportamiento poco profesional en la Casa Blanca. A través de la falsedad y la traición busca ganar relevancia y dinero a expensas de la señora Trump".(Lea también: Trump tuvo un asistente llamado 'el hombre de la música' para calmar su ira).Ahora bien, a continuación podrá saber cinco cosas que se exponen el libro de Grisham sobre la exprimera dama:
Leía su propia prensa
Aunque cuando vivía en la Casa Blanca Melania no era muy expresiva en cuanto a los comentarios que hacían sobre ella, Grisham comenta que la esposa del expresidente solía leer lo que la prensa escribía sobre ella. "Como su esposo y todos sus hijos, la Sra. Trump escudriñó sus recortes de prensa como un arquitecto experto que se enfoca en planos. No se le pasó por alto ningún detalle, no pasó nada por alto. Tenía las alertas de Google configuradas para ella y lo vio todo", escribió la autora del libro.(De interés: Trump demanda a su sobrina y al NY Times por investigación sobre finanzas).
Estaba fuera de su oficina
Grisham comentó que Melania no pasaba mucho tiempo en la espaciosa 'suite' que se le asignó, sino que solía trabajar desde su casa, mucho antes de que el covid-19 estuviera presente. Incluso, el Servicio Secreto la llamaba 'Rapunzel' porque permanecía "en su torre"."Teníamos reuniones en persona, pero por lo general se llevaban a cabo en la sala de mapas frente a los ascensores a la residencia. Allí planificaríamos los horarios, responderíamos a consultas urgentes y discutiríamos los objetivos", afirmó Grisham.La autora dijo, adicionalmente, que la exprimera dama dedicaba mucho tiempo a su cuidado personal: "Ella creía que la relajación era fundamental para el régimen de belleza de uno, al igual que, por supuesto, los tratamientos de spa y faciales".(Además: Donald Trump quiso pintar su avión para que se pareciera al presidencial).
La relación entre Melania e Ivanka Trump
De acuerdo con Grisham, había tensión entre la esposa y la hija de Donald Trump porque Ivanka, quien era llamada por su madrastra como 'la princesa', tenía el deseo de ser el centro de atención en los eventos públicos y viajes.Según el escrito de la exasesora, Melania era una estudiante de protocolo y solía ser muy rigurosa en cuanto a respetar las tradiciones de los países que son reservadas solo para un presidente y su cónyuge, no para la hija del mandatario y su esposo.
Rumores de infidelidad
Cuando en 2018 se divulgaron las acusaciones de infidelidad de Donald Trump con la actriz porno Stormy Daniels y la exmodelo de 'Playboy' Karen MacDougal, se dice que Melania tomó una caravana separada para llegar al discurso del Estado de la Unión de ese año. Sin embargo, esta información no se confirmó.No obstante, Grisham dijo que la mujer sí estaba enojada con su esposo y no quiso exponerse públicamente junto a él."Sentí que la señora Trump estaba avergonzada, y que quería que él también se sintiera avergonzado. No sé si él es capaz de eso o no", escribió Grisham.(Le recomendamos: Capitolio de EE. UU., en alerta por manifestación de partidarios de Trump).
Melania y la chaqueta
En 2018, la exprimera dama apareció con una chaqueta verde que decía en la espalda 'Realmente no me importa. ¿A ti?', durante una visita a un centro de detención de Texas. Según cuenta la exasesora, posiblemente Melania no sabía las críticas que iba a recibir por el mensaje de la chaqueta justo cuando acudía a una causa preocupante para el país en ese momento.Grisham aseguró, además, que el entonces presidente Donald Trump parecía molesto por la situación y miro a su esposa para decirle: "¿Qué diablos estabas pensando?".
(Siga leyendo: General de EE.UU. alertó a China sobre la salud mental de Trump, dice libro).ELTIEMPO.COM
this should work
text = parsed_html.find('div', attrs={'class' : 'articulo-contenido'}).div
for child in text.children:
if not child.name:
continue
elif child.name=='p' and 'contenido' in child.attrs['class']:
page_text += '\n' + child.text
elif child.name=='span' and 'articulo-subtitulo' in child.attrs['class']:
page_text += '\n\n' + child.text
print(page_text)
if you catch your elements by chunks (catch all subtitles, catch all paragraphs), you won't be able to put them back into their flow. "go with the flow"

Save rows of a text in a dictionary

I'm web scraping to get information about articles from a website, for that text I want to save the header of the text and the description as key and value in a dictionary.
When I run the code, I get an error unhashable type: 'list'. What I can do to fix this?
This is all the code:
import requests
import bs4
from bs4 import BeautifulSoup
import smtplib
import os
bodyDict = dict()
newslist = list()
body = "NEWS:\n"
web = requests.get("http://www.infobolsa.es/news")
soup = bs4.BeautifulSoup(web.text, 'lxml')
for item in soup.find_all("article"):
newslist.append(item.text.split("\n"))
for row in newslist:
bodyDict[newslist[1]]=newslist[3]
print(bodyDict)
This can be achieved using the code below. We need to get the header (in <h3> tags) and the value (in the last <p>) tag for each <article> tag in the page. I've assumed that you want to ignore header tags that have the class 'video'.
import requests
import bs4
bodyDict = dict()
web = requests.get("http://www.infobolsa.es/news")
soup = bs4.BeautifulSoup(web.text, 'lxml')
for item in soup.find_all("article"):
# Find the header
header = item.find('h3')
# Ignore headers that are videos
if 'video' in header.get('class', []):
continue
# Get the value of the last p tag
value = item.find_all('p')[-1].text
# Append to dictionary
bodyDict[header.text] = value
Which gives us:
{'PharmaMar recibe 200 millones de dólares como pago inicial del acuerdo firmado con Jazz': 'PharmaMar y Jazz firmaron el pasado 19 de diciembre de 2019 un acuerdo de licencia en exclusiva para la comercialización de lurbinectedina en Estados Unidos.\xa0PharmaMar también podrá recibir hasta 800 millones de dólares adicionales en potenciales pagos por hitos, además de los royalties sobre las ventas netas.',
'El Ibex 35, el índice con mayor fortaleza de Europa hoy': 'Los índices europeos y sus futuros, futuro del Dax y futuro del Euro Stoxx 50, a media mañana están con subidas, pero han perdido el rumbo y están a la espera de lo que pueda hacer el futuro del SP500 que les sirva de\xa0 guía para tomar una dirección. El Ibex 35 es el más destacado gracias a que el Banco Santander lidera las subidas (+3,68%).',
'Eurostoxx 50: primer objetivo 3.730 puntos': 'Ángel Cotera, especialista de mercados de BBVA Trader analiza desde un punto de vista técnico el Eurostoxx 50.',
'Grenergy tiene la confianza de Caixabank y su recomendación de compra': 'Los analistas otorgan un precio objetivo\xa0de 18,65 euros la compañía de renovables, lo que supone un recorrido alcista del 21,10% para los títulos de la\xa0compañía de energías renovables en el Mercado Continuo.',
'UBS eleva la recomendación de Bankinter en un momento correctivo en bolsa': 'El organismo cree que con el mínimo histórico al que cotizan actualmente la acciones cualquier riesgo está "mejor reflejado". Sube su recomendación hasta neutral.',
'La FED afronta su primera reunión del año sin la presión de los mercados ni de Trump': 'Juan Ramón Casanovas, Head of Private Portfolio Management, Bank Degroof Petercam Spain valora las opciones que tiene Jerome Powell en la primera reunión de la FED del año.',
'PharmaMar tendrá en China la tecnología para detectar el coronavirus en 6 semanas': 'La biotecnológica española cuenta con la tecnología para detectar el virus y está trabajando para adaptar las máquinas\xa0de diagnóstico de Genomica con las que cuenta en Wuhan.',
'Airbus provisiona 3.600 millones para pagar posibles sanciones por corrupción': 'Airbus ha provisionado\xa03.600 millones de euros\xa0para el pago de posibles sanciones a las autoridades francesas, británicas y estadounidenses. Las investigaciones emprendidas por dichas autoridades conciernen a acusaciones de soborno y de corrupción así como a imprecisiones en declaraciones hechas a las autoridades de los Estados Unidos de acuerdo con el International Traffic in Arms Regulations (ITAR).',
'Logista aumenta su beneficio un 3,3% hasta los 37,2 millones': 'El distribuidor de productos minoristas Logista alcanzó un beneficio neto en su\xa0primer trimestre fiscal\xa0del año (octubre-diciembre) de 37,2 millones de euros, lo que supone un aumento del 3,3%.',
'Santander solo aspira a rebotes a corto plazo': 'Santander continúa inmerso en una clara tendencia bajista de largo plazo que permanece vigente mientras el precio no consiga superar 3,9395 / 3,8655. Si el precio consigue respetar los mínimos del año pasado y el volumen aumenta se avanzaría en la construcción de un suelo. \xa0',
'Banco Santander lleva al Ibex 35 por encima de los 9.500 puntos': 'El Ibex 35 arranca la sesión con subidas del 0,49% que le llevan a los 9.532 puntos. Subidas que lideran los títulos de Banco\xa0 Santander que, tras la publicación de sus resultados, ha llegado a subir más de un 3% en la apertura.',
'El mayor banco de Canadá sobrepondera ahora las acciones de Repsol': 'Los analistas de\xa0Royal Bank of Canada (RBC) han elevado este miércoles\xa0la recomendación de Repsol de "infraponderar" hasta\xa0"sobreponderar", ya que según el mayor banco canadiense\xa0la petrolera española ha empezado a mostrar una mejor relación riesgo-rentabilidad que la mayoría de sus\xa0competidoras.',
'Las bolsas europeas abren con tono mixto pendientes de China y la FED': 'Los índices de las principales bolsas europeas comienzan la sesión con tono mxixto. El DAX sube un 0,04%, hasta los 13.328 puntos; el FTSE -100 arranca la sesión con subidas del 0,13%, hasta los 7.491 puntos. El CAC-40 abre en los 5.926 pntos mientras que el Eurostoxx 50 abre en los 3.722 puntos tras avanzar ligeramente. El FTSE MiB en negativo sobre los 24.024 puntos. Hoy toda la atención sobre China y la primera reunión del año de la FED.',
'Banco Santander reduce un 17% su beneficio en 2019, hasta los 6.515 millones': 'Banco Santander ha anunciado una reducción del 17% en su beneficio atribuido en 2019, hasta los 6.515 millones. Y eso a pesar de que en el cuarto trimestre la entidad incrementó en un 35% su beneficio logrando así el mayor beneficio atribuido de la historia, en los 2.783 millones. La compañía propone aumentar el dividendo en efecto.',
'MAB: ventajas de las empresas al cotizar en Bolsa': 'Las pymes son actrices protagonistas de la economía española. Sólo alguien que no sepa de economía las consideraría actrices de reparto, ya que emplean al 80% de nuestra fuerza laboral y representan el 65% de nuestro PIB. Cuando necesitan financiación, visibilidad, liquidez, y el resto de ventajas que conlleva cotizar, disponen de una plataforma hecha a su medida: el Mercado Alternativo Bursátil (MaB). Sus integrantes volverían a dar el salto sin dudarlo, pero se quejan de que le siguen faltando tamaño y, por ende, liquidez.',
'Tesla sigue alcista tras superar en Bolsa a Volkswagen': '\xa0',
'"Los sectores más atractivos y que más nos gustan son los más caros: tecnología y salud"': 'Hablamos de los mercados con Josep Bayarri, director de productos, análisis e inversiones de Arquia Banca.\xa0',
'"Creemos que es más fácil, en un año como este, invertir en pequeñas y medianas compañías"': 'Hablamos de los mercados y para ello contamos con la presencia de Álvaro de Liniers, responsable de desarrollo de negocio de Groupama AM para España.',
'Reunión de la Fed y resultados de Logista y Santander, en la agenda del día': 'Este miércoles los inversores y analistas estarán muy pendientes del índice de confianza del consumidor Gfk, decisión de tipos de interés de la Fed, variación de ventas de viviendas pendientes y conferencia de prensa de la\xa0Comité Federal del Mercado Abierto de la Reserva Federal.'}

Regex for retrieve range of text in python

I'm trying to split a long text of a Norm and extract specific range of text that are the articles of that Norm. I found that using re.split() in python is the best way (I think) to make the job. So here is an example of the text (Spanish) that I'm trying to split
test = "11.3.2 Debe llevarse a cabo mediante equipos o sistemas de seguridad que eviten
la explosión por golpe, chispa o calentamiento. 12. Requisitos de seguridad e
higiene para el transporte y almacenamiento de sustancias corrosivas, irritantes
o tóxicas 12.1 El almacenamiento de sustancias corrosivas, irritantes o tóxicas debe
hacerse en recipientes específicos, de materiales compatibles con la sustancia de
que se trate. 12.2 Cuando el transporte de sustancias corrosivas, irritantes o
tóxicas en los centros de trabajo se realice a través de un sistema de tuberías o
recipientes portátiles, éstos deben estar cerrados para evitar que su contenido se
derrame o fugue."
So what I want to achieve is to split the text and have an array of the articles. ['11.3.2 Debe llevarse ...','12. Requisitos ...','12.1 El almacenamiento ...','12.2 Cuando...'].
So currently what I've done with no success is:
re.split("\s(\d{1,2}\.\d*\.*\d*\s[A-Z]+)",test)
As a result:
['11.3.2 Debe llevarse a cabo ...', '12. R', 'equisitos de seg ...', '12.1 E', 'l almacenamiento de sustancias corrosivas ... ', '12.2 C', 'uando el transporte de sustancias corrosivas ...', '13. V', 'igilancia La vigilancia del...']
Any suggestions?
You could do the following:
import re
test = """11.3.2 Debe llevarse a cabo mediante equipos o sistemas de seguridad que eviten
la explosión por golpe, chispa o calentamiento. 12. Requisitos de seguridad e
higiene para el transporte y almacenamiento de sustancias corrosivas, irritantes
o tóxicas 12.1 El almacenamiento de sustancias corrosivas, irritantes o tóxicas debe
hacerse en recipientes específicos, de materiales compatibles con la sustancia de
que se trate. 12.2 Cuando el transporte de sustancias corrosivas, irritantes o
tóxicas en los centros de trabajo se realice a través de un sistema de tuberías o
recipientes portátiles, éstos deben estar cerrados para evitar que su contenido se
derrame o fugue."""
pattern = re.compile('\d{1,2}(\.\d{1,2})*([^\d]+)')
for match in pattern.finditer(test):
print(match.group())
print('-----------')
Output
11.3.2 Debe llevarse a cabo mediante equipos o sistemas de seguridad que eviten
la explosión por golpe, chispa o calentamiento.
-----------
12. Requisitos de seguridad e
higiene para el transporte y almacenamiento de sustancias corrosivas, irritantes
o tóxicas
-----------
12.1 El almacenamiento de sustancias corrosivas, irritantes o tóxicas debe
hacerse en recipientes específicos, de materiales compatibles con la sustancia de
que se trate.
-----------
12.2 Cuando el transporte de sustancias corrosivas, irritantes o
tóxicas en los centros de trabajo se realice a través de un sistema de tuberías o
recipientes portátiles, éstos deben estar cerrados para evitar que su contenido se
derrame o fugue.
-----------
The pattern \d{1,2}(\.\d{1,2})*([^\d]+) will match the header (the numbering) followed by everything that is not a number. As an alternative you could use the following, with a lookahead:
pattern = re.compile('\d{1,2}(\.\d{1,2})*(.+?)(?=(\d{1,2}(\.\d{1,2})*|$))', re.DOTALL)
for match in pattern.finditer(test):
print(match.group())
print('-----------')
Output
11.3.2 Debe llevarse a cabo mediante equipos o sistemas de seguridad que eviten
la explosión por golpe, chispa o calentamiento.
-----------
12. Requisitos de seguridad e
higiene para el transporte y almacenamiento de sustancias corrosivas, irritantes
o tóxicas
-----------
12.1 El almacenamiento de sustancias corrosivas, irritantes o tóxicas debe
hacerse en recipientes específicos, de materiales compatibles con la sustancia de
que se trate.
-----------
12.2 Cuando el transporte de sustancias corrosivas, irritantes o
tóxicas en los centros de trabajo se realice a través de un sistema de tuberías o
recipientes portátiles, éstos deben estar cerrados para evitar que su contenido se
derrame o fugue.
-----------
The idea is to match everything that is followed by a header or the end of the text. Note the use of the flag re.DOTALL.
I suggest split by the number of the norms and then join the pieces 2 by 2
x = re.split(r"(?:\A\s*|\.\s+)(\d+(?:(?:[.]\d+)+|[.]))", test_str)[1:]
list = [i+j for i,j in zip(x[::2], x[1::2])]
print(list)
See demo here
Another solution with findall:
re.findall(r"(?s)(?:\d+\.\s|(?:\d+\.)+\d+\s)(?:(?!\d+\.).)+",txt)
Out:
['11.3.2 Debe llevarse a cabo mediante equipos o sistemas de seguridad que eviten \nla explosión por golpe, chispa o calentamiento.',
'12. Requisitos de seguridad e \nhigiene para el transporte y almacenamiento de sustancias corrosivas, irritantes \no tóxicas',
'12.1 El almacenamiento de sustancias corrosivas, irritantes o tóxicas debe \nhacerse en recipientes específicos, de materiales compatibles con la sustancia de \nque se trate.',
'12.2 Cuando el transporte de sustancias corrosivas, irritantes o \ntóxicas en los centros de trabajo se realice a través de un sistema de tuberías o \nrecipientes portátiles, éstos deben estar cerrados para evitar que su contenido se \nderrame o fugue.']
"""
(?s) '.' matches \n, too
(?:\d+\.\s|(?:\d+\.)+\d+\s) the exact numbering pattern
(?:(?!\d+\.).)+ matches any character which not a start of a numbering
Edit:
(?:.(?!\d+\.))+ changed to (?:(?!\d+\.).)+
The previous pattern cuts the last char (in our case the space) before the numbering.
"""

How to fix this regex in order to preserve a given id order?

I have this large string:
s = '''Vaya ir VMM03S0 0.427083
mañanita mañana RG 0.796611
, , Fc 1
buscando buscar VMG0000 1
la lo PP3FSA00 0.0277039
encontramos encontrar VMIP1P0 0.65
. . Fp 1
Pero pero CC 0.999764
vamos ir VMIP1P0 0.655914
a a SPS00 0.996023
lo el DA0NS0 0.457533
que que PR0CN000 0.562517
interesa interesar VMIP3S0 0.994868
LO_QUE_INTERESA_La lo_que_interesa_la NP00000 1
lavadora lavador AQ0FS0 0.585262
tiene tener VMIP3S0 1
una uno DI0FS0 0.951575
clasificación clasificación NCFS000 1
A+ a+ NP00000 1
, , Fc 1
de de SPS00 0.999984
las el DA0FP0 0.970954
que que PR0CN000 0.562517
ahorran ahorrar VMIP3P0 1
energía energía NCFS000 1
, , Fc 1
si si CS 0.99954
me me PP1CS000 0.89124
no no RN 0.998134
equivoco equivocar VMIP1S0 1
. . Fp 1
Lava lavar VMIP3S0 0.397388
hasta hasta SPS00 0.957698
7 7 Z 1
kg kilogramo NCMN000 1
, , Fc 1
no no RN 0.998134
está estar VAIP3S0 0.999201
, , Fc 1
se se P00CN000 0.465639
le le PP3CSD00 1
veía ver VMII3S0 0.62272
un uno DI0MS0 0.987295
gran gran AQ0CS0 1
tambor tambor NCMS000 1
( ( Fpa 1
de de SPS00 0.999984
acero acero NCMS000 0.973481
inoxidable inoxidable AQ0CS0 1
) ) Fpt 1
y y CC 0.999962
un uno DI0MS0 0.987295
error error NCFSD23 0.234930
error error VMDFG34 0.98763
consumo consumo NCMS000 0.948927
máximo máximo AQ0MS0 0.986111
de de SPS00 0.999984
49 49 Z 1
litros litro NCMP000 1
error error DI0S3DF 1
Mandos mandos NP00000 1
intuitivos intuitivo AQ0MP0 1
, , Fc 1
todo todo PI0MS000 0.43165
muy muy RG 1
bien bien RG 0.902728
explicado explicar VMP00SM 1
, , Fc 1
jamas jamas RG 0.343443
nada nada PI0CS000 0.850279
que que PR0CN000 0.562517
de de SPS00 0.999984
nunca nunca RG 0.903
casa casa NCFS000 0.979058
de de SPS00 0.999984
mis mi DP1CPS 0.995868
error error VM9032 0.234323
string string VMWEOO 0.03444
padres padre NCMP000 1
Además además NP00000 1
incluye incluir VMIP3S0 0.994868
la el DA0FS0 0.972269
tecnología tecnología NCFS000 1
error errpr RG2303 1
Textileprotec textileprotec NP00000 1
que que PR0CN000 0.562517
protege proteger VMIP3S0 0.994868
nuestras nuestro DP1FPP 0.994186
ninguna ninguno DI0S3DF 0.345344
falla falla NCFSD23 1
prendas prenda NCFP000 0.95625
más más RG 1
preciadas preciar VMP00PF 1
jamas jamas RG2303 1
string string VM9032 0.234323
nunca nunca RG 0.293030
string string VM 0.902333
no no RN
le le PP004DF 0.390230
falla fallar VM0FD00 0.99033
. . Fp 1'''
I would like to extract in a list the second word from left to right and its id that holds this ids pattern: RN_ _ _ _ _, PP_ _ _ _ _, VM_ _ _ _ _. This ids must be together. For example:
no no RN 0.90383
le le PPSDF23 0.902339
falla fallar VM00DKE 0.9045
This is the pattern I would like to match, since they are together and the ids have the RN_ _ _ _ _, PP_ _ _ _ _, VM_ _ _ _ _ order this should be the output given the s string:
[('no RN', 'le PP004DF', 'fallar VM0FD00')]
This is what I tried:
together__ = re.findall(r'(?s)(\w+\s+RN)(?:(?!\s(?:RN|PP|VM)).)*?(\w+\s+PP\w+)(?:(?!\s(?:RN|PP|VM)).)*?(\w+\s+VM\w+)', s)
but I get this with the above regex:
print together__
output:
[('no RN', 'le PP3CSD00', 'ver VMII3S0'), ('no RN', 'le PP004DF', 'fallar VM0FD00')]
Which is wrong since the ids are not consecutevely in the string s (RN, PP, VM). How can I fix this regex?. Thanks in advance guys.
You better
You can do this simply with:
list = re.findall(r'\n?\s*\S+\s+(\w+\W+RN\w*)[^\n]*[^\n]*?\n\s*\S+\s+(\w+\W+PP\w*)[^\n]*[^\n]*?\n\s*\S+\s+(\w+\W+VM\w*)[^\n]*', s)
Resulting in:
[('no RN', 'le PP004DF', 'fallar VM0FD00')]
because ver VM is first.
In case you don't get a decent answer soon enough, I think that I may be close to what you want with this:
re.findall(r'\n[^\n]*?\s(.*?\sRN[^\n]*)\n[^\n]*?\s(.*?\sPP[^\n]*)\n[^\n]*?\s(.*?\sVM[^\n]*)\n', s)
I don't know why I get both words in the first item... might be because of the "#" and I did not bother cutting after RN, PP and VM. I guess that if the first step works decently enough, the rest can be easily fixed in post-processing.

Preserving the order/occurrence of an adjective,noun label-id with a regular expression? [duplicate]

This question already has answers here:
Extracting tuples with nltk?
(2 answers)
Closed 8 years ago.
Im new with python could anybody help me on how can to create a regular expresion given a list of strings like this:
test_string = "pero pero CC
tan tan RG
antigua antiguo AQ0FS0
que que CS
según según SPS00
mi mi DP1CSS
madre madre NCFS000"
how to return a tuple like this where NCFS00 denotes female noun and AQ0FS0 denotes female adjective (in spanish), the morphological order is important, since they have to match as the following example:
> ([madre, NCFS00],[antigua, AQ0FS0])
I would like to return the word with it´s associated tag given test_string if and only if they have the adjective, noun morphological occurrence (e.g. [Noun, NCFS00],[Adjective, AQ0FS0]) this is what i done:
# -- coding: utf-8 --
import re
#str = "pero pero CC " \
"tan tan RG " \
"antigua antiguo AQ0FS0" \
"que que CS " \
"según según SPS00 " \
"mi mi DP1CSS " \
"madre madre NCFS000"
tupla1 = re.findall(r'(\w+)\s\w+\s(AQ0FS0)', str)
print tupla1
tupla2 = re.findall(r'(\w+)\s\w+\s(NCFS00)',str)
print tupla2
the output is the following:
[('antigua', 'AQ0FS0')] [('madre', 'NCFS00')]
The problem with this output is that if i pass it a long test_string i need to preserve the "order" or "occurrence" of the tags (i.e. i only can print a tuple if and only if they have the following order: AQ0FS0 and NCFS000 in oder words: female adjective, female noun).
For example, if i pass a string like this:
str = ''' Hola hola I 1
compis compis NCMS000 0.500006
! ! Fat 1
No no RN 0.998045
sabía saber VMII3S0 0.592869
como como CS 0.999289
se se P00CN000 0.465639
ponía poner VMII3S0 0.65
una uno DI0FS0 0.951575
lavadora lavadora NCFS000 0.414738
hasta hasta SPS00 0.957698
que que PR0CN000 0.562517
conocí conocer VMIS1S0 1
esta este DD0FS0 0.986779
y y CC 0.999962
es ser VSIP3S0 1
que que CS 0.437483
es ser VSIP3S0 1
muy muy RG 1
sencilla sencillo AQ0FS0 1
de de SPS00 0.999984
utilizar utilizar VMN0000 1
! ! Fat 1
Todo todo DI0MS0 0.560961
un uno DI0MS0 0.987295
gustazo gustazo NCMS000 1
cuando cuando CS 0.985595
estamos estar VAIP1P0 1
aprendiendo aprender VMG0000 1
para para SPS00 0.999103
emancipar emancipar VMN0000 1
nos nos PP1CP000 1
, , Fc 1
que que CS 0.437483
si si CS 0.99954
nos nos PP1CP000 0.935743
ponen poner VMIP3P0 1
facilidad facilidad NCFS000 1
con con SPS00 1
las el DA0FP0 0.970954
tareas tarea NCFP000 1
de de SPS00 0.999984
la el DA0FS0 0.972269
casa casa NCFS000 0.979058
pues pues CS 0.998047
mejor mejor AQ0CS0 0.873665
que que PR0CN000 0.562517
mejor mejor AQ0CS0 0.873665
. . Fp 1
Antes_de antes_de SPS00 1
esta este PD0FS000 0.0132212
teníamos tener VMII1P0 1
otra otro DI0FS0 0.803899
de de SPS00 0.999984
la el DA0FS0 0.972269
marca marca NCFS000 0.972603
Otsein otsein NP00000 1
, , Fc 1
de de SPS00 0.999984
estas este DD0FP0 0.97043
que que PR0CN000 0.562517
van ir VMIP3P0 1
incluidas incluir VMP00PF 1
en en SPS00 1
el el DA0MS0 1
mobiliario mobiliario NCMS000 0.476077
y y CC 0.999962
además además RG 1
era ser VSII1S0 0.491262
de de SPS00 0.999984
carga carga NCFS000 0.952569
superior superior AQ0CS0 0.992424
, , Fc 1
pero pero CC 0.999764
tan tan RG 1
antigua antiguo AQ0FS0 0.953488
que que CS 0.437483
según según SPS00 0.995943
mi mi DP1CSS 0.999101
madre madre NCFS000 1
, , Fc 1
nadie nadie PI0CS000 1
la lo PP3FSA00 0.0277039
podía poder VMII3S0 0.63125
tocar tocar VMN0000 1
porque porque CS 1
solo solo RG 0.0472103
la lo PP3FSA00 0.0277039
entendía entender VMII3S0 0.65
ella él PP3FS000 1
. . Fp 1
Esta este PD0FS000 0.0132212
es ser VSIP3S0 1
de de SPS00 0.999984
la el DA0FS0 0.972269
marca marca NCFS000 0.972603
Aeg aeg NP00000 1
y y CC 0.999962
dentro_de dentro_de SPS00 1
este este DD0MS0 0.960092
tipo tipo NCMS000 1
de de SPS00 0.999984
lavadoras lavadora NCFP000 0.411969
de de SPS00 0.999984
esta este DD0FS0 0.986779
marca marca NCFS000 0.972603
las lo PP3FPA00 0.0289466
había haber VAII1S0 0.353863
más más RG 1
caras caro AQ0FP0 0.417273
o o CC 0.999769
más más RG 1
baratas barato AQ0FP0 0.3573
y y CC 0.999962
está estar VAIP3S0 0.999201
digamos decir VMSP1P0 0.785925
que que CS 0.437483
está estar VAIP3S0 0.999201
en en SPS00 1
el el DA0MS0 1
punto punto NCMS000 1
medio medio AQ0MS0 0.314286
. . Fp 1
Es ser VSIP3S0 1
de de SPS00 0.999984
color color NCMS000 1
blanco blanco AQ0MS0 0.598684
y y CC 0.999962
tiene tener VMIP3S0 1
carga carga NCFS000 0.952569
frontal frontal AQ0CS0 0.657209
, , Fc 1
con con SPS00 1
una uno DI0FS0 0.951575
capacidad capacidad NCFS000 1
de de SPS00 0.999984
6kg 6kg Z 1
. . Fp 1
En en SPS00 1
casa casa NCFS000 0.979058
a_pesar_de a_pesar_de SPS00 1
ser ser VSN0000 0.940705
cuatro 4 Z 1
, , Fc 1
se se P00CN000 0.465639
ponen poner VMIP3P0 1
lavadoras lavadora NCFP000 0.411969
casi casi RG 1
todos todo DI0MP0 0.624221
o o CC 0.999769
todos todo DI0MP0 0.624221
los el DA0MP0 0.976481
días día NCMP000 1
. . Fp 1
En en SPS00 1
su su DP3CS0 1
parte parte NCFS000 0.499183
de de SPS00 0.999984
arriba arriba RG 0.986014
encontramos encontrar VMIP1P0 0.65
la el DA0FS0 0.972269
" " Fe 1
; ; Fx 1
zona zona NCFS000 1
de de SPS00 0.999984
mandos mando NCMP000 1
" " Fe 1
; ; Fx 1
, , Fc 1
donde donde PR000000 0.967437
se se P00CN000 0.465639
puede poder VMIP3S0 0.999117
echar echar VMN0000 1
el el DA0MS0 1
detergente detergente NCMS000 0.49273
, , Fc 1
aunque aunque CC 1
en en SPS00 1
nuestro nuestro DP1MSP 0.94402
caso caso NCMS000 0.99812
lo lo PP3CNA00 0.271177
a a SPS00 1
el el DA0MS0 1
ser ser VSN0000 0.940705
gel gel NCMS000 1
lo lo PP3CNA00 0.271177
ponemos poner VMIP1P0 1
directamente directamente RG 1
junto_con junto_con SPS00 1
la el DA0FS0 0.972269
ropa ropa NCFS000 1
. . Fp 1
Luego luego RG 0.996689
tiene tener VMIP3S0 1
la el DA0FS0 0.972269
rueda rueda NCFS000 0.72093
para para SPS00 0.999103
elegir elegir VMN0000 1
el el DA0MS0 1
programa programa NCMS000 0.953488
y y CC 0.999962
los el DA0MP0 0.976481
intermitentes intermitente NCMP000 0.342773
que que PR0CN000 0.562517
indican indicar VMIP3P0 1
en en SPS00 1
que que CS 0.437483
paso paso NCMS000 0.905738
de de SPS00 1
el el DA0MS0 1
programa programa NCMS000 0.953488
estaba estar VAII1S0 0.5
. . Fp 1
Como como CS 0.999289
todas todo PI0FP000 0.0490506
tiene tener VMIP3S0 1
programas programa NCMP000 0.97619
más más RG 1
cortos corto AQ0MP0 1
y y CC 0.999962
más más RG 1
largos largo AQ0MP0 0.97619
, , Fc 1
incluso incluso RG 0.996383
un uno DI0MS0 0.987295
programa programa NCMS000 0.953488
que que PR0CN000 0.562517
seria seriar VMIP3S0 0.151546
como como CS 0.999289
lavar lavar VMN0000 1
a a SPS00 0.996023
mano mano NCFS000 0.992095
y y CC 0.999962
otro otro DI0MS0 0.612994
ideal ideal NCMS000 0.5
para para SPS00 0.999103
estores estor NCMP000 1
, , Fc 1
que que PR0CN000 0.562517
salen salir VMIP3P0 0.972603
casi casi RG 1
secos seco AQ0MP0 1
y y CC 0.999962
planchaditos planchar VMP00PM 0.691767
para para SPS00 0.999103
colgar colgar VMN0000 1
y y CC 0.999962
ya ya RG 0.999395
está estar VAIP3S0 0.999201
. . Fp 1
Es ser VSIP3S0 1
muy muy RG 1
fácil fácil AQ0CS0 1
de de SPS00 0.999984
aprender aprender VMN0000 1
la lo PP3FSA00 1
y y CC 0.999962
además además RG 1
tiene tener VMIP3S0 1
indicador indicador NCMS000 0.64273
por por SPS00 1
sonido sonido NCMS000 1
de de SPS00 0.999984
cuando cuando CS 0.985595
acaba acabar VMIP3S0 0.992958
, , Fc 1
lista listar VMIP3S0 0.220088
para para SPS00 0.999103
abrir abrir VMN0000 1
y y CC 0.999962
tender tender VMN0000 1
. . Fp 1
Por por SPS00 1
decir decir VMN0000 0.997512
algo algo PI0CS000 0.900246
malo malo AQ0MS0 0.657087
de de SPS00 0.999984
ella él PP3FS000 1
, , Fc 1
sería ser VSIC1S0 0.5
que que CS 0.437483
cuando cuando CS 0.985595
centrifuga centrifugar VMIP3S0 0.994859
, , Fc 1
algo algo PI0CS000 0.900246
que que PR0CN000 0.562517
hace hacer VMIP3S0 1
muy muy RG 1
bien bien RG 0.902728
, , Fc 1
pues pues CS 0.998047
vibra vibrar VMIP3S0 0.994856
un uno DI0MS0 0.987295
poco poco RG 0.542435
y y CC 0.999962
se se P00CN000 0.465639
nota notar VMIP3S0 0.419995
el el DA0MS0 1
ruido ruido NCMS000 1
jeje jeje NCMS000 0.833445
, , Fc 1
pero pero CC 0.999764
no no RN 0.998134
se se P00CN000 0.465639
mueve mover VMIP3S0 0.994868
de de SPS00 0.999984
su su DP3CS0 1
sitio sitio NCMS000 0.980769
! ! Fat 1
! ! Fat 1
Saludillos saludillos NP00000 0.411768
! ! Fat 1
'''
I have the following output:
[('sencilla', 'AQ0FS0'), ('antigua', 'AQ0FS0')]
[('lavadora', 'NCFS00'), ('facilidad', 'NCFS00'), ('casa', 'NCFS00'), ('marca', 'NCFS00'), ('carga', 'NCFS00'), ('madre', 'NCFS00'), ('marca', 'NCFS00'), ('marca', 'NCFS00'), ('carga', 'NCFS00'), ('capacidad', 'NCFS00'), ('casa', 'NCFS00'), ('parte', 'NCFS00'), ('zona', 'NCFS00'), ('ropa', 'NCFS00'), ('rueda', 'NCFS00'), ('mano', 'NCFS00')]
Which don´t preserve the previous Noun, adjective order.
Here you go (fyi -- I advise you not use str as a variable)
import re
s = "pero pero CC " \
"tan tan RG " \
"antigua antiguo AQ0FS0" \
"que que CS " \
"según según SPS00 " \
"mi mi DP1CSS " \
"madre madre NCFS000"
print re.findall(r'([^\s]+) \1 ([^\s]+)', s)

Categories