web-dev-qa-db-fra.com

Comment faire correspondre un nouveau caractère de ligne dans une chaîne brute Python

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?

21
wei

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'
25
mgilson

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.

5
Gareth Latty
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_
0

vous pouvez aussi utiliser [\ r\n] pour faire correspondre la nouvelle ligne