繁体   English   中英

正则表达式——Python【列表查询】

[英]Regular expression - Python [list query]

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

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

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

output 应该是

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

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

谢谢。

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

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

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

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

  • (?<.[.]) -> 如果前面有句点则不匹配
  • [ ][AZ][Az]* -> 任何大写的单词(有一个前导空格,以确保是否永远不会匹配字符串中的第一个单词)

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

一些限制

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM