【问题标题】:replace more than one pattern python替换多个模式python
【发布时间】:2026-01-24 06:25:02
【问题描述】:

我查看了各种链接,但都展示了如何一次性替换多个单词。但是,我想替换模式而不是单词,例如

RT @amrightnow:“真正的特朗普”特朗普关于你”观看制作 #1 https:\/\/t.co\/j58e8aacrE #tcot #pjnet #1A #2A #Tru mp #trump2016 https:\/\/t.co\u2026

当我对上述文本执行以下两个命令时,我得到了所需的输出

result = re.sub(r"http\S+","",sent)
result1 = re.sub(r"@\S+","",result)

这样,我将删除所有 url 和 @(推文中的处理程序)。输出将如下所示:

>>> result1
'RT  "The Real Trump" Trump About You" Watch Make #1  #tcot #pjnet #1A #2A #Trump #trump2016 '

谁能告诉我最好的方法是什么?我将基本上从文件中读取推文。我想阅读每条推文并将这些处理程序和网址替换为空白。

【问题讨论】:

    标签: python regex twitter


    【解决方案1】:

    您需要正则表达式“或”运算符,即管道|

    re.sub(r"http\S+|@\S+","",sent)
    

    如果您有一长串要删除的模式,一个常见的技巧是使用join 创建正则表达式:

    to_match = ['http\S+',
                '@\S+',
                'something_else_you_might_want_to_remove']
    
    re.sub('|'.join(to_match), '', sent)
    

    【讨论】:

    • 正在阅读文档,我得到了以下“A|B,其中 A 和 B 可以是任意 RE,创建将匹配 A 或 B 的正则表达式。任意数量的 RE 可以用“|”隔开以这种方式。这也可以在组内使用(见下文)。当目标字符串被扫描时,REs 由 '|' 分隔从左到右尝试。当一个模式完全匹配时,该分支被接受。这意味着一旦 A 匹配,B 将不会被进一步测试,即使它会产生更长的整体匹配“因此我没有使用它。这份文件让我很困惑
    • 是的,这对我来说也没有意义,我只知道这就是你这样做的方式。
    • 正则表达式可以重叠。例如,re.sub(r'ab|abc', '', 'abc') 返回'c'。最左边的正则表达式匹配 'ab' 所以它赢了。结果是你必须考虑你写它们的顺序。在这种情况下,有一些潜在的重叠(例如,第一个正则表达式将匹配 'http@something')但我认为它仍然符合你想要的。
    【解决方案2】:

    您可以通过| 分隔模式来使用“或”模式:

    import re
    
    s = u'RT @amrightnow: "The Real Trump" Trump About You" Watch Make #1 https:\/\/t.co\/j58e8aacrE #tcot #pjnet #1A #2A #Tru mp #trump2016 https:\/\/t.co\u2026'
    result = re.sub(r"http\S+|@\S+", "", s)
    print result
    

    输出

    RT“真正的特朗普”特朗普关于你”观看制作 #1 #tcot #pjnet #1A #2A #Tru mp #trump2016

    请参阅 regular expression syntax 文档中的 '|' 小节。

    【讨论】:

    • 有人打败了你!
    • @tdelaney:是的,他们做到了。它们基本上是相同的答案,尽管我的显示了一个完整的工作示例。
    • @mhawke 正如我在上面提到的那样,文档让我很困惑,说一旦 A 通过它就不会看 B.. 那是什么意思??
    • @user1122534 这意味着如果你的模式是'foo|bar|barbaz'并且字符串是'barbaz',那么模式将匹配bar(因为它首先尝试foo,不匹配,然后bar,匹配)并且不会匹配更长的barbaz(因为一旦找到匹配它就会停止尝试)。