用python重新转换字符串

时间:2011-12-05 17:49:48

标签: python regex

我得到一个字符串:

>>> 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。任何人都可以指出我弄错了吗?

3 个答案:

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