我得到一个字符串:
>>> 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模块,并写了这样的东西:
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
。任何人都可以指出我弄错了吗?
答案 0 :(得分:4)
\s
匹配空格,\t
,\n
(并且,根据您的正则表达式引擎)还有一些其他空白字符。
因此,如果您只想替换单个换行符+空格/制表符,则可以使用:
newline = re.sub(r"(?<!\n)\n[ \t]*(?!\n)", "", line)
<强>解释强>
(?<!\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
在Python中:
>>> line = " abc\n def\n\n ghi\n jkl"
>>> newline = re.sub(r"(?<!\n)\n[ \t]*(?!\n)", "", line)
>>> print newline
abcdef
ghijkl
答案 1 :(得分:0)
试试这个,
line = " abc\n def\n\n ghi\n jkl"
print re.sub(r'\n(?!\n)\s*', '', line)
它给出了,
abcdef
ghijkl
它说,&#34;替换一个新行,然后是一个不是新行的空格。&#34;
更新:这是一个更好的版本
>>> re.sub(r'([^\n])\n(?!\n)\s*', r'\1', line)
' abcdef\n\n ghijkl'
它完全给出了你在第一篇文章中所说的内容。
答案 2 :(得分: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