正则表达式不匹配,取决于单词数

时间:2018-10-09 16:02:07

标签: python regex match

考虑一个包含以下内容的文件:

Jesus is friends with Chuck Norris
Cindy Crawford is friends with Nicole Kidman
V is friends with Barack Obama
Chuck Norris is friends with Barack Obama
V is friends with François Hollande
Penelope Cruiz is friends with Tom Cruise
Nicole Kidman is friends with Tom Cruise
Katie Holmes is friends with Tom Cruise
Sim is friends with Lara Croft
Sim is friends with Chuck Norris
Lara Croft is friends with V
Yvette Horner is friends with Sim
François Hollande is friends with Barack Obama
Sim is friends with Jesus
Tom Cruise is friends with Barack Obama

我正在尝试匹配所有基本上采用这种格式的行:

first_name (last_name?) 'is friends with' first_name (last_name?)

基本上,有些行中可以有全名,有些行可以有名和全名,或者全名和名,等等...在句子的中间带有“是朋友”。

这是我在Python中使用的当前正则表达式:

(\w+ \w+) (is friends with) (\w+ \w+)

,但这仅匹配“ full_name是具有full_name的朋友”行。我似乎无法找到一种方法来匹配那些拥有两个名字,或一个全名和一个名字,等等的人。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以为2个名字添加2次可选的非捕获组(?:来匹配空格,并为\w+添加一次或多次(或指定character class来匹配多个{ {1}})

\w

Regex demo

您可以使用星号(\w+(?: \w+)?) (is friends with) (\w+(?: \w+)?)而不是问号*重复非捕获组零次或更多次

答案 1 :(得分:0)

只需在\w中加入空格,就可以捕获单个名称和全名。

([\w ]+) (is friends with) ([\w ]+)

Regex101 sample

答案 2 :(得分:0)

您可以使用以下内容来匹配可变长度名称:

See regex in use here

(\w+(?: \w+)*) is friends with (\w+(?: \w+)*)
  • (\w+(?: \w+)*)将以下内容分组为第1组
    • \w+匹配任何单词字符1次或更多次
    • (?: \w+)*匹配一个空格,后跟一个或多个单词字符,任意次数

请注意,在Python中,\w默认与ç之类的特殊字符匹配。