【问题标题】:Replace a line break using regular expression in Python...在 Python 中使用正则表达式替换换行符...
【发布时间】:2017-07-02 16:26:05
【问题描述】:

这里是 Python 新手,使用 3.5。我觉得这个问题与此处提出的其他问题相似,但是尽管阅读了这些问题并尝试遵循给出的建议,但我仍然无法使用这个正则表达式。

我有一个文本字符串,其中我想用空格替换所有不跟另一个换行符或三个空格的换行符。我正在尝试使用带有负前瞻的正则表达式来做到这一点。我了解到我需要使用来自this conversation 的多行。尽管如此,我的正则表达式并没有在我的字符串中识别任何内容。基本上,我想匹配并替换下面字符串中间的 \r\n ,同时保持字符串开头和结尾的那些不变。

body = 'foo foo\r\n\xa0\xa0\xa0foo foo foo\r\n\foo foo foo foo foo\r\n\r\n\foo foo foo'

breakRegex = re.compile(r'(\r\n)?!(\r\n)|(\r\n)?!(\s\s\s)', s,re.M)

breakRegex.sub(' ', body)

理想的和迄今为止未达到的结果是:

'foo foo\r\n\xa0\xa0\xa0foo foo foo foo foo foo foo foo\r\n\r\n\foo foo foo'

我也试过上面没有那么多括号,用 \s 代替 \xa0 等等,但它仍然不起作用......感谢您提供的任何帮助。

【问题讨论】:

  • 如果有多个换行符彼此相邻,您希望它们全部保留,除了最后一个之外都保留,还是只剩下一个?
  • 为什么最后一个换行符(\r\n\r\n\foo foo foo)没有被删除?
  • 感谢您的回复!好问题,我的计划(和我)没有充分考虑......我认为如果删除额外的 \r\n 以便只剩下一个,实际上会更好,尽管最初我希望它们保留(尽管我的方法不正确)。

标签: python regex newline


【解决方案1】:

这是你想要的吗?

break_regex = re.compile(r'\r\n(?!=\r\n|\s\s\s)', re.M)

所有换行符\r\n, 后面没有(?!=...), 要么(|), 另一个换行符\r\n, 或三个空格\s\s\s

编辑:

  1. 抱歉,我弄错了,您应该尽快删除正则表达式中的=。 :)

  2. 你是这个意思吗?:

body = 'foo foo\r\n\xa0\xa0\xa0foo foo foo\r\nfoo foo foo foo foo\r\n\r\nfoo foo foo'

代替:

body = 'foo foo\r\n\xa0\xa0\xa0foo foo foo\r\n\foo foo foo foo foo\r\n\r\n\foo foo foo'`

因为\f 表示Formfeed (0x0c)。

【讨论】:

  • 你输入的内容对我来说很有意义,但我在实际程序和 pythex.org 中都尝试了这个正则表达式,但它无法识别换行符。
  • 感谢指正。尽管如此,在删除 = 符号后,正则表达式并没有捕获任何内容。你对 \f 是正确的,不过,我确实是 meanbody = 'foo foo\r\n\xa0\xa0\xa0foo foo foo\r\nfoo foo foo foo foo\r\n\r\nfoo foo foo'
  • 另外,作为一个仅供参考,虽然 r' 版本在 Pythex 上不起作用,\\r\\n(?!\\r\\n|\\xa0\\xa0\\ xa0) 在 Pythex 上选择所需的组。您在上面给出的版本,但使用 xa0 而不是 s,似乎在实际代码中工作,我想这是一个编码问题。感谢您的帮助!
  • 不客气。 Pythex 不能以这种方式工作的原因是:与您的正则表达式字符串不同,Pythex 不会将测试字符串中的“\”视为转义字符,而是将其视为实际的“\”,因此它们不会匹配.当您将正则表达式更改为 \\r\\n(?!\\r\\n|\\xa0\\xa0\\xa0) 时,Pythex 认为您的正则表达式想要与实际的 '\' 匹配,因此它们匹配.
  • 另外 \s 和 \xa0 的区别在于,\s 匹配很多东西,包括:简单的空格字符(''),制表符('\t'),垂直制表符('v' )、换行符 ('\n')、回车 ('\r')、换页符 ('\f')。但是 \xa0 只与“不间断空间”匹配。还要注意'\r\n',一些平台使用简单的\n来代替。
【解决方案2】:
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>!@#$%^&*()[]{};:,./<>?\|`~-= _+\<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_

【讨论】:

    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2011-10-05
    相关资源
    最近更新 更多