ü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
Antwort
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'
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
@ user1783403 - Sie haben Recht. Ich sollte die Dokumentation mehr lesen. mit 're.M' werden'^'und' $ 'intuitiver zugeordnet. – mgilson
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. –
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.
@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. –
Ja, ich hätte das vorher auch nie überprüft :) – mgilson
Warum das -1 auf diesem? –
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_
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
Sorry, Sie zu verwirren. Ich spreche von einem regelmäßigen Ausdruck. – wei