[英]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.