2013-02-04 6 views
18

übereinstimmen Ich habe ein wenig verwirrt über Python rohe Zeichenfolge. Ich weiß, dass wenn wir eine rohe Zeichenkette verwenden, es '\' als normalen Backslash behandelt (zB r '\ n' wäre '\' und 'n'). Ich frage mich jedoch, was passiert, wenn ich ein neues Zeilenzeichen in einer rohen Zeichenfolge abgleichen möchte. Ich habe es versucht, aber es hat nicht funktioniert. Hat jemand eine gute Idee?Wie ein neues Zeilenzeichen in Python rohen Zeichenfolge

+0

Welche Art von Spiel reden wir über Hier? Sprichst du von einem regulären Ausdruck oder einfach von einem 'if ... in my_raw_string'? – mgilson

+0

Sorry, Sie zu verwirren. Ich spreche von einem regelmäßigen Ausdruck. – wei

Antwort

17

In einem regulären Ausdruck, müssen Sie, dass Sie in mehrzeiligen Modus sind spezifizieren:

>>> import re 
>>> s = """cat 
... dog""" 
>>> 
>>> re.match(r'cat\ndog',s,re.M) 
<_sre.SRE_Match object at 0xcb7c8> 

Beachten Sie, dass re die \n (raw string) in Newline übersetzt. Wie Sie in Ihren Kommentaren angezeigt, die Sie nicht wirklich Notwendigkeitre.M für sie, zu passen aber mit passendem $ und ^ intuitiver hilft:

>> 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' 
+0

Danke für deine Antwort @mgilson! Ich würde auch gerne wissen, warum wir den Multiline-Modus angeben müssen. Ich habe versucht, ohne es zu vergleichen, wie dies "re.match (r'cat \ ndog 's)" und es funktioniert immer noch. – wei

+0

@ user1783403 - Sie haben Recht. Ich sollte die Dokumentation mehr lesen. mit 're.M' werden'^'und' $ 'intuitiver zugeordnet. – mgilson

+0

Irgendeine Möglichkeit, '$' auf "weniger intuitiv" zu bringen - d. H. * Nur * am Ende der Zeichenkette zu entsprechen? Ich will nicht, dass es vor '\ n' übereinstimmt. –

4

Die einfachste Antwort ist, einfach keine rohe Zeichenfolge zu verwenden. Sie können Backslashes umgehen, indem Sie \\ verwenden.

Wenn Sie große Anzahl von Schrägstrichen in einigen Segmenten haben, dann könnten Sie rohe Strings und normale Strings je nach Bedarf verketten:

r"some string \ with \ backslashes" "\n" 

(Python automatisch verkettet Stringliterale mit nur Leerzeichen zwischen ihnen.)

Denken Sie daran, wenn Sie mit Pfaden unter Windows arbeiten, ist die einfachste Option, nur Schrägstriche zu verwenden - es funktioniert immer noch gut.

+0

@mgilson Ich habe nur überprüft, dass es mit rohen Saiten und normalen Saiten funktioniert, da es nicht etwas ist, das ich gemacht habe. Bearbeitet, wie es tut. Es ist tatsächlich ein wenig besser, da ich glaube, dass die Verkettung zur Parse-Zeit durchgeführt wird, anstatt wenn sie ausgeführt wird. –

+0

Ja, ich hätte das vorher auch nie überprüft :) – mgilson

+0

Warum das -1 auf diesem? –

0
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>[email protected]#$%^&*()[]{};:,./<>?\|`~-= _+\<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_