我已经进行过搜索和搜索,但无法解决我的正则表达难题。
我写了下面的假句:
观看Joe Smith Jr.和Saul" Canelo" Alvarez为WBO腰带GGG战斗Oscar de la Hoya和Genaddy Triple-G Golovkin。 Canelo Alvarez和Floyd' Money'梅威瑟在新泽西州大西洋城的战斗。 Conor MacGregor将与Adonis超人史蒂文森和Sugar Ray Robinson先生一同出席。 "这里有一个字符串"。 '钱梅威瑟'。 "这不是一个字符串","这不是一个字符串","这是一个" "三个字符串"。
我正在寻找一个在Python 3.6中使用时将返回以下内容的正则表达式:
Canelo,Money,Money Mayweather,Three Word String
让我最接近的正则表达式是:
(["'])[A-Z](\\?.)*?\1
我希望它只匹配由单引号或双引号括起来的3个大写单词或更少单词的字符串。不幸的是,到目前为止它似乎匹配引号中的任何字符串,无论长度如何,无论内容是什么,只要它以大写字母开头。
我已经花了很多时间尝试自己破解它,但我已经撞墙了。任何拥有强大的正则表达功夫的人都可以让我知道我在哪里出错吗?
答案 0 :(得分:4)
尝试使用这个:(["'])((?:[A-Z][a-z]+ ?){1,3})\1
(["'])
- 开场白
([A-Z][a-z]+ ?){1,3}
- 大写单词重复1到3次,以空格分隔
[A-Z] - 大写字母(字开头字符)
[a-z] + - 非大写字母(单词结尾)
_? - 大写单词的空格分隔符(
_
是空格),?
表示没有结束空格的单个单词{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
答案 1 :(得分:0)
使用您提供的文字,我会尝试使用正则表达式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']
答案 2 :(得分:0)
以下是我的评论:([\"'])(([A-Z][^ ]*? ?){1,3})\1