【问题标题】:Regular expression - Python [list query]正则表达式 - Python [列表查询]
【发布时间】:2020-10-15 11:40:54
【问题描述】:

我正在尝试为此列表编写一个正则表达式:

data= ["Fred is Deputy Manager. He is working for MNC.", "Rita is another employee in AC Corp."]

我想删除所有以大写字母开头的单词,但它不应该检查每个句子的第一个单词,即它不应该检查 Fred、He 和 Rita。

输出应该是

Output-["Fred is. He is working for.", "Rita is another employee in."]

我尝试寻找解决方案,但找不到任何相关代码。 任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 你应该提供你迄今为止尝试过的东西。
  • 我试过这个answer = [re.sub(r'([^.])([A-Z]\w*)', r'\1'|,sent) for d in data] 但它不起作用
  • 将其编辑到您的问题中
  • 为了让这个问题变得更好,请edit它,添加您尝试过的代码并更详细地解释这一点“但它不起作用”。谢谢..

标签: python python-3.x regex regular-language


【解决方案1】:

您需要找到并删除所有不跟在标点符号后面的大写单词,然后找到并删除尾随空格(这个解决方案不是最干净的,但它确实有效)。列表推导式在这里也能派上用场。

import re

data = ["Fred is Deputy Manager. He is working for MNC.", "Rita is another employee in AC Corp."]
# find and replace all capital words that don't follow punctuation with ''
text = [re.sub(r'(?<!\.\s)(?!^)\b([A-Z]\w*(?:\s+[A-Z]\w*)*)', '', item) for item in data]
# find and remove all trailing spaces before periods
output = [re.sub(r'\s([?.!"](?:\s|$))', r'\1', item) for item in text]

>>> output
['Fred is. He is working for.', 'Rita is another employee in.']

【讨论】:

    【解决方案2】:

    首先,让我为 python 3 的正则表达式文档的无用表示歉意。回答这个问题的所有信息技术上都可以在here 中找到,但您已经需要了解re 的工作原理才能理解它。话虽如此,但愿这能给你一个帮助:

    一个简单的答案

    您可以尝试以下代码:

    import re
    
    data = ["Fred is Deputy Manager. He is working for MNC.", "Rita is another employee in AC Corp."]
    
    matcher = re.compile("(?<![.])[ ][A-Z][A-z]*")
    print([matcher.sub("",d) for d in data])
    # prints: ['Fred is. He is working for.', 'Rita is another employee in.']
    

    基本上,这会编译一个正则表达式,它将匹配不带句点的大写单词:

    • (?&lt;![.]) -> 如果前面有句点则不匹配
    • [ ][A-Z][A-z]* -> 任何大写的单词(有一个前导空格,确保永远不会匹配字符串中的第一个单词)

    然后,它将该正则表达式应用于列表中的每个字符串,并用空字符串替换匹配项:""

    一些限制

    如果您的字符串曾经有双空格或其他空白字符(如制表符或回车)会破坏这一点。您可以改用以下方法解决此问题:

    matcher = re.compile("(?<![.])\s+[A-Z][A-z]*")
    

    \s+ 将匹配一个或多个空白字符

    此外,如果您的字符串以空格开头,那也会破坏这一点。您可以使用以下方法解决此问题:

    print([matcher.sub("",d.strip(" ")) for d in data])
    

    从字符串中删除前导或尾随空白字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 2020-12-24
      • 2021-08-18
      相关资源
      最近更新 更多