正则表达式匹配仅包含3个或更少大写单词的引号中的字符串

时间:2017-06-30 18:46:05

标签: python regex python-3.x

我已经进行过搜索和搜索,但无法解决我的正则表达难题。

我写了下面的假句:

  

观看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个大写单词或更少单词的字符串。不幸的是,到目前为止它似乎匹配引号中的任何字符串,无论长度如何,无论内容是什么,只要它以大写字母开头。

我已经花了很多时间尝试自己破解它,但我已经撞墙了。任何拥有强大的正则表达功夫的人都可以让我知道我在哪里出错吗?

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