Python正则表达式,用于在行首标识两个连续的大写单词

2024-05-16 02:16:22 发布

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

我有一段文字,我想从中删除出现的每个名字,“Remggrehte Sertrro”和“Perrhhfson Forrtdd”。我尝试应用这个正则表达式:([A-Z][a-z]+(?=\s[A-Z])(?:\s[A-Z][a-z]+)+),但它标识了文本中的“Remggrehte Sertrro We”、“Perrhhfson Forrtdd If”和“Mash Mush”。 基本上,我希望它只识别行首的前两个大写单词,而不涉及其他单词。我不是正则表达式专家,我不知道如何适应它

全文如下:

雷姆格雷特·塞特罗

多年来,我们确实希望每周工作4天

佩尔霍夫森·弗尔特德

如果drumph没有得到足够的测试和PPE装备,经济混乱将继续

提前谢谢


Tags: 文本if名字单词标识we文字mash
3条回答

可以使用re.MULTILINE标志和以下正则表达式删除仅包含名称的行:r"^(?:[A-Z]\w+\s+[A-Z]\w+\s+)$"。此正则表达式仅在不包含额外文本的行中匹配每个名称

下面是一个演示:

import re

text = """\
Remggrehte Sertrro

Remggrehte Sertrro We did want a 4-day work week for years.

Perrhhfson Forrtdd

Perrhhfson Forrtdd If drumph does n't get sufficient testing and PPE gear , the economy Mash Mush will continue to.
"""

print(re.sub(r"^(?:[A-Z]\w+\s+[A-Z]\w+\s+)$", "", text, flags=re.MULTILINE))

你会得到:


Remggrehte Sertrro We did want a 4-day work week for years.


Perrhhfson Forrtdd If drumph does n't get sufficient testing and PPE gear , the economy Mash Mush will continue to.

你不需要积极的前瞻来匹配前两个大写的单词

在您的模式中,这个部分(?=\s[A-Z])可以在您第一次断言它时省略,然后直接匹配它


您可以在不使用捕获组的情况下匹配前两个单词,并在右侧断言空白边界(?!\S)

^[A-Z][a-z]+[^\S\r\n][A-Z][a-z]+(?!\S)

解释

  • ^字符串的开头
  • [A-Z][a-z]+匹配字符a-Z和1+小写字符a-Z
  • [^\S\r\n]匹配除换行符之外的空白字符,因为\s也可以匹配换行符,并且您希望匹配行首的两个连续大写单词
  • [A-Z][a-z]+匹配字符a-Z和1+小写字符a-Z
  • (?!\S)在右侧断言空白边界

Regex demo

注意[A-Z][a-z]+只匹配字符a-z。要匹配单词字符,可以使用\w而不是只使用[a-z]

如果您始终确定只得到两个首字母大写的术语,并且总是在前两个术语中内联,则可以使用此模式/^([A-Z]+.*? ){2}/mExample working on regex101.com

相关问题 更多 >