2013-02-04 13 views
18

Pythonの生の文字列についてちょっと混乱しました。生の文字列を使用すると、通常のバックスラッシュ(例:r '\ n'は '\'と 'n')として '\'を扱うことがわかります。しかし、生の文字列に改行文字をマッチさせたいのではないかと思っていました。私はr '\ n'を試みたが、うまくいかなかった。誰もがこれについて良いアイデアを持っていますか?Pythonの生の文字列の改行文字の一致方法

+0

私たちが話している試合のどのような種類ここに?正規表現のマッチについて話していますか、単にif ... in my_raw_string'ですか? – mgilson

+0

ご迷惑をおかけします。私は正規表現について話している。 – wei

答えて

17

、あなたは複数行モードにしていることを指定する必要があります:reは改行に\n(生の文字列)を変換すること

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

は注意してください。あなたのコメントで示されているように、それが一致するためにあなたが実際にre.Mは必要ありませんが、それは、より直感的に$^を照合に役立ちん:

>> 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

あなたの答えに感謝@mgilson!なぜマルチラインモードを指定する必要があるのか​​も知りたいです。私はこの "re.match(r'cat \ ndog '、s)"のように、それなしでマッチングを試みました。 – wei

+0

@ user1783403 - あなたは正しいです。私はもっ​​とドキュメントを読むべきです。 're.M'を指定すると直感的に一致させるために'^'と' $ 'が得られます。 – mgilson

+0

「$」を「あまり直感的ではない」、つまり文字列の最後に*のみ*とマッチさせる方法はありますか? '\ n'の前に一致させたくありません –

4

最も単純な答えは、単純に生の文字列を使用しないことです。 \\を使用してバックスラッシュをエスケープすることができます。

あなたには、いくつかのセグメント内のバックスラッシュの膨大な数を持っている場合は、必要に応じて、あなたは生の文字列と、通常の文字列を連結することができます:

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

(Pythonは自動的にそれらの間の唯一の空白で文字列リテラルを連結します。)

Windows上のパスで作業している場合、最も簡単なオプションはスラッシュだけを使用することです。スラッシュはそのまま使用できます。正規表現で

+0

@mgilson生の弦と普通の弦で動作しているかどうかをチェックしていました。編集されています。実際には、連結がパース時に実行されるのではなく、パース時に実行されると思うので、少し上手くなります。 –

+0

ええ、私は今までに実際にチェックしたことはありませんでした:) – mgilson

+0

これはなぜ? –

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_ 
関連する問題