Je suis un peu confus à propos de la chaîne brute Python. Je sais que si nous utilisons une chaîne brute, alors il traitera "\" comme une barre oblique inverse normale (par exemple, r "\ n" serait "\" et "n"). Cependant, je me demandais si je voulais faire correspondre un nouveau caractère de ligne dans une chaîne brute. J'ai essayé r '\ n', mais cela n'a pas fonctionné. Quelqu'un a une bonne idée à ce sujet?
Dans une expression régulière, vous devez spécifier que vous êtes en mode multiligne:
>>> import re
>>> s = """cat
... dog"""
>>>
>>> re.match(r'cat\ndog',s,re.M)
<_sre.SRE_Match object at 0xcb7c8>
Notez que re
traduit le \n
(chaîne brute) en nouvelle ligne. Comme vous l'avez indiqué dans vos commentaires, vous n'avez pas besoin dere.M
pour que cela corresponde, mais cela aide de façon plus intuitive à faire correspondre $
et ^
:
>> 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 réponse la plus simple est simplement de ne pas utiliser de chaîne brute. Vous pouvez échapper aux barres obliques inverses en utilisant \\
.
Si vous avez un très grand nombre de barres obliques inverses dans certains segments, vous pouvez alors concaténer des chaînes brutes et des chaînes normales au besoin:
r"some string \ with \ backslashes" "\n"
(Python concatène automatiquement les littéraux de chaîne avec uniquement des espaces entre eux.)
N'oubliez pas que si vous utilisez des chemins sous Windows, l'option la plus simple consiste à utiliser des barres obliques: tout fonctionnera bien.
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_
vous pouvez aussi utiliser [\ r\n] pour faire correspondre la nouvelle ligne