2011-12-05 17 views
2

再パイソンに変換します。文字列私は、文字列のラインを取得

>>> line = " abc\n def\n\n ghi\n jkl" 
>>> print line 
    abc 
    def 

    ghi 
    jkl 

を、私はそれが "ABCDEF \ N \ N GHIJKL"、のように変換したい:

>>> print " abcdef\n\n ghijkl" 
    abcdef 

    ghijkl 

私はPythonの再を試してみましたモジュール、およびこのような何か書く:

re.sub('(?P<word1>[^\n\s])\n\s*(?P<word2>[^\n\s])', '\g<word1>\g<word2>', line) 

を私はこれを取得:

>>> re.sub('(?P<word1>[^\n\s])\n\s*(?P<word2>[^\n\s])', '\g<word1>\g<word2>', line) 
Out: ' abcdefghijkl' 

\n\s*の部分も\n\nと一致しているようです。私はそれが間違ってどこを指摘することができますか?

答えて

4

\sは、スペースに一致し、\t\n(正規表現エンジンによって異なる)いくつかの空白文字があります。

newline = re.sub(r"(?<!\n)\n[ \t]*(?!\n)", "", line) 

説明:Pythonで

(?<!\n) # Assert that the previous character isn't a newline 
\n  # Match a newline 
[ \t]* # Match any number of spaces/tabs 
(?!\n) # Assert that the next character isn't a newline 

>>> line = " abc\n def\n\n ghi\n jkl" 
>>> newline = re.sub(r"(?<!\n)\n[ \t]*(?!\n)", "", line) 
>>> print newline 
    abcdef 

    ghijkl 
0

だから、あなたは、単一の改行+スペース/タブを交換したい場合は、これを使用することができます

お試しください。

それは言う

は、 "何も新しいラインていないスペースに続く新しい行を、交換してください。"


GHIJKL ABCDEF

それが与える

line = " abc\n def\n\n ghi\n jkl" 
print re.sub(r'\n(?!\n)\s*', '', line) 

UPDATE:ここでは、より良いバージョン

>>> re.sub(r'([^\n])\n(?!\n)\s*', r'\1', line) 
' abcdef\n\n ghijkl' 

だそれはあなたが最初の記事で述べた、まさに提供します。

0

あなたが\Sを使用した場合は、任意の非空白文字にマッチした、正規表現を簡素化することができます:

>>> import re 
>>> line = " abc\n def\n\n ghi\n jkl" 
>>> print re.sub(r'(\S+)\n\s*(\S+)', r'\1\2', line) 
    abcdef 

    ghijkl 

あなた<word1><word2>グループのみが一致しているので、しかし、あなた自身の正規表現が動作しない理由があります(つまり、彼らは+を使用していません)。したがって、単純な補正で、正規表現は正しい出力を生成します:

>>> print re.sub(r'(?P<word1>[^\n\s]+)\n\s*(?P<word2>[^\n\s]+)', r'\g<word1>\g<word2>', line) 
    abcdef 

    ghijkl 
関連する問題