我一直在寻找,但找不到任何缓解我的复仇之祸的办法。
我写了以下假句子:
看着小乔·史密斯。和索尔“卡内洛”阿尔瓦雷斯战斗奥斯卡德拉霍亚和吉纳迪三-G戈洛夫金为WBO带G。卡内洛阿尔瓦雷斯和弗洛伊德‘金钱’梅威瑟战斗在大西洋城,新泽西州。Conor MacGregor将与Adonis Superman Stevenson和Sugar Ray Robinson先生一起出席。“这是一根绳子”。“金钱梅威瑟”。“这不是字符串”,“这不是字符串”,“这是”三个字串“。
我正在寻找一个正则表达式,当在Python3.6中使用时,它将返回以下内容:
卡内洛,钱,钱,梅威瑟,三个字串
最接近我的准则是:
(["'])[A-Z](\\?.)*?\1我希望它只匹配三个大写字串,或更少立即被单引号或双引号包围。不幸的是,到目前为止,它似乎匹配任何字符串的引号,无论长度,无论内容,只要它是以大写字母开头。
我花了很多时间试图自己破解它,但我碰到了一堵墙。谁有更强的武功能让我知道我在哪里出了什么问题?
发布于 2017-06-30 19:05:24
尝试使用以下一个:(["'])((?:[A-Z][a-z]+ ?){1,3})\1
(["']) -开场白
([A-Z][a-z]+ ?){1,3} -大写单词重复1到3次,用空格隔开
A-Z -大写字符(字起始字符) a-z+ -非大写字符(字尾) _?-大写单词的空格分隔符(
_是空格),?用于单字w/o结尾空间。 {1,3} -1至3次
\1 -闭幕式报价,与开盘相同
Group 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
发布于 2017-06-30 19:07:34
在使用您提供的文本时,我将尝试使用正则表达式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']发布于 2017-06-30 19:09:50
这就是我要做的:([\"'])(([A-Z][^ ]*? ?){1,3})\1
https://stackoverflow.com/questions/44853048
复制相似问题