【问题标题】:Python Regex how to match a substring without replace a part of thatPython Regex如何匹配子字符串而不替换其中的一部分
【发布时间】:2021-03-09 08:19:35
【问题描述】:

我有以下一句话:

sentence = "工作\n经验\n\n初体验..."

Work 
Experience 

 First Experience...

所以,我想删除工作和体验之间的“\n”,但同时我不想删除体验后的“\n\n”。

Work Experience 

First Experience...

我尝试了不同的解决方案,例如:

string = re.sub(" \n{1}[^\n]"," ",sentence)

但它们都删除了 \n (E) 之后的第一个字符。

更新:感谢@Wiktor,我设法找到了解决方案

print(re.sub(r'\w .*?\w+', lambda x: x.group().replace('\n', ''), sentence, flags=re.S))

【问题讨论】:

    标签: python regex text nlp text-processing


    【解决方案1】:

    如果你想让它成为一个通用的解决方案来删除任意数量的\n,一个换行符,在两个字符串之间,你可以使用

    import re
    sentence = "Work \nExperience \n\n First Experience..."
    print( re.sub(r'Work.*?Experience', lambda x: x.group().replace('\n', ''), sentence, flags=re.S) )
    

    请参阅Python demo。输出:

    Work Experience 
    
     First Experience...
    

    Work.*?Experiencere.S 匹配(包括)WorkExperience 之间的任何子字符串,然后在删除所有换行符时在每次匹配时处理匹配数据对象 (x) 使用 @987654330 @ 并且这些修改后的字符串作为替换模式返回给re.sub

    【讨论】:

    • 感谢您的回答!如果我有一个大文本,其中不仅针对这种情况而且针对其他句子重复了这个问题怎么办?我直观地尝试过: re.sub(r'\w .*?\w', lambda x: x.group().replace('\n', ''), sentence, flags=re.S)但显然效果不佳
    • @sergiozavota 从需求开始。你应该从什么开始匹配?它应该以什么结尾?
    • 这些词不是“静态的”,所以你可以有 sentence1 = "Work \nExperience \n\n First Experience..." sentence2 = "Sergio \nZavota \n\n Second Experience.. ." sentence3 = "Wiktor \nStribiżew \n\n 第三体验..." 等等..
    • @sergiozavota 那么模式是什么?这里有什么规律?我们怎么知道我们需要从Wiktor匹配到Stribiżew
    • @sergiozavota 很高兴你发现了它。此外,您可以使用单词边界而不是空格:r'\w\b.*?\w+'
    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2021-07-11
    相关资源
    最近更新 更多