[英]Regex to match strings in quotes that contain only 3 or less capitalized words
我已经搜索了很多,但找不到正则表达式问题的任何缓解方法。
我写了下面的假句子:
观看小乔·史密斯(Joe Smith Jr.)和索尔(Canul)阿尔瓦雷斯(Saul“ Canelo” Alvarez)为WBO腰带GGG与Oscar de la Hoya和Genaddy Triple-G Golovkin的对抗。 卡内洛·阿尔瓦雷斯(Canelo Alvarez)和弗洛伊德(Moy)梅威瑟(Mayweather)在新泽西州大西洋城展开战斗。 Conor MacGregor将与Adonis超人Stevenson和Sugar Ray Robinson先生一同出席。 “这是弦乐”。 '钱梅威瑟'。 “这不是字符串”,“这不是字符串”,“这是一个”“三字字符串”。
我正在寻找在Python 3.6中使用时将返回以下内容的正则表达式:
Canelo,钱,钱梅威瑟,三字串
使我最接近的正则表达式是:
(["'])[A-Z](\\?.)*?\1
我希望它仅匹配3个大写字母或更少的字符串,并立即用单引号或双引号引起来。 不幸的是,到目前为止,无论长度如何,内容如何,引号似乎都可以匹配任何字符串,只要它以大写字母开头即可。
我花了很多时间亲自尝试破解它,但是我碰壁了。 拥有更强的正则表达式功夫的人可以给我一个我在哪里错的想法吗?
尝试使用此命令: (["'])((?:[AZ][az]+ ?){1,3})\\1
(["'])
-开头报价
([AZ][az]+ ?){1,3}
-大写单词重复1到3次,以空格分隔
[AZ]-大写字符(单词开头的字符)
[az] +-非大写字符(字尾)
_? -大写单词的空格分隔符(
_
是一个空格)?
没有结束空间的单个单词{1,3}-1至3次
\\1
结束报价,与开始相同
第2组是您想要的。
Match 1
Full match 29-37 `"Canelo"`
Group 1. 29-30 `"`
Group 2. 30-36 `Canelo`
Match 2
Full match 146-153 `'Money'`
Group 1. 146-147 `'`
Group 2. 147-152 `Money`
Match 3
Full match 318-336 `'Money Mayweather'`
Group 1. 318-319 `'`
Group 2. 319-335 `Money Mayweather`
Match 4
Full match 398-417 `"Three Word String"`
Group 1. 398-399 `"`
Group 2. 399-416 `Three Word String`
RegEx101演示: https ://regex101.com/r/VMuVae/4
使用您提供的文本,我将尝试使用正则表达式lookaround
四周,以使单词被引号引起来,然后对这些匹配项应用一些条件,以确定哪些匹配项符合您的条件。 以下是我会做的事情:
[p for p in re.findall('(?<=[\'"])[\w ]{2,}(?=[\'"])', txt) if all(x.istitle() for x in p.split(' ')) and len(p.split(' ')) <= 3]
txt
是您在此处提供的文本。 输出如下:
# ['Canelo', 'Money', 'Money Mayweather', 'Three Word String']
清洁器:
matches = []
for m in re.findall('(?<=[\'"])[\w ]{2,}(?=[\'"])', txt):
if all(x.istitle() for x in m.split(' ')) and len(m.split(' ')) <= 3:
matches.append(m)
print(matches)
# ['Canelo', 'Money', 'Money Mayweather', 'Three Word String']
这是我的工作: ([\\"'])(([AZ][^ ]*? ?){1,3})\\1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.