正则表达式Python[列表查询]

2024-04-27 14:44:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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."]

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

谢谢


Tags: in列表fordataisanotheremployeemanager
2条回答

您需要查找并删除所有不在标点符号后面的大写单词,然后查找并删除尾随空格(此解决方案不是最干净的,但它可以工作)。列表理解在这里也很有用

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.']

首先,让我为Python3的正则表达式文档的无用性道歉。回答这个问题的所有信息在技术上都是可以找到的,但是你已经需要知道一些关于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.']

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

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

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

一些限制

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

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

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

而且,如果你的弦有一个空格,这也会打破这个。您可以使用以下方法解决此问题:

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

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

相关问题 更多 >