online - Cómo hacer coincidir un nuevo carácter de línea en la cadena en bruto de Python
re.findall python example (4)
Me confundí un poco sobre la cuerda cruda de Python. Sé que si usamos una cadena en bruto, tratará ''/' como una barra invertida normal (por ejemplo, r ''/ n'' sería ''/' y ''n''). Sin embargo, me preguntaba qué ocurriría si quiero hacer coincidir un nuevo carácter de línea en una cadena sin formato. Intenté r ''/ n'', pero no funcionó. ¿Alguien tiene alguna buena idea sobre esto?
En una expresión regular, debe especificar que está en modo multilínea:
>>> import re
>>> s = """cat
... dog"""
>>>
>>> re.match(r''cat/ndog'',s,re.M)
<_sre.SRE_Match object at 0xcb7c8>
Tenga en cuenta que re
traducir el /n
(cadena sin formato) a nueva línea. Como indicaste en tus comentarios, en realidad no necesitas re.M
para que coincida, pero te ayuda a hacer coincidir $
y ^
más intuitiva:
>> re.match(r''^cat/ndog'',s).group(0)
''cat/ndog''
>>> re.match(r''^cat$/ndog'',s).group(0) #doesn''t match
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ''NoneType'' object has no attribute ''group''
>>> re.match(r''^cat$/ndog'',s,re.M).group(0) #matches.
''cat/ndog''
La respuesta más simple es simplemente no usar una cadena en bruto. Puedes escapar de barras invertidas usando //
.
Si tiene una gran cantidad de barras invertidas en algunos segmentos, puede concatenar cadenas sin formato y cadenas normales según sea necesario:
r"some string / with / backslashes" "/n"
(Python concatena automáticamente literales de cadena con solo espacios en blanco entre ellos).
Recuerde que si está trabajando con rutas en Windows, la opción más sencilla es usar solo barras diagonales, aún así funcionará bien.
también puede usar [/ r / n] para hacer coincidir con una nueva línea
def clean_with_puncutation(text):
from string import punctuation
import re
punctuation_token={p:''<PUNC_''+p+''>'' for p in punctuation}
punctuation_token[''<br/>'']="<TOKEN_BL>"
punctuation_token[''/n'']="<TOKEN_NL>"
punctuation_token[''<EOF>'']=''<TOKEN_EOF>''
punctuation_token[''<SOF>'']=''<TOKEN_SOF>''
#punctuation_token
regex = r"(<br/>)|(<EOF>)|(<SOF>)|[/n/!/@/#/$/%/^/&/*/(/)/[/]/
{/}/;/:/,/.///?/|/`/_//+///=/~/-/</>]"
###Always put new sequence token at front to avoid overlapping results
#text = ''<EOF>!@#$%^&*()[]{};:,./<>?/|`~-= _+/<br/>/n <SOF>/ ''
text_=""
matches = re.finditer(regex, text)
index=0
for match in matches:
#print(match.group())
#print(punctuation_token[match.group()])
#print ("Match at index: %s, %s" % (match.start(), match.end()))
text_=text_+ text[index:match.start()] +" "
+punctuation_token[match.group()]+ " "
index=match.end()
return text_