正则表达式不匹配取决于字数

2024-06-25 05:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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?)

基本上,有些行可以有全名,有些行可以有名字和全名,或者全名和名字,等等。。。在句子中间加上“is friends with”

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

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

但这一个只匹配“全名是朋友与全名”行。我似乎找不到一种方法来匹配那些有两个名字的人,或者一个全名和一个名字的人,等等

有什么想法吗


Tags: nameiswithsim名字cruisetomfriends
3条回答

您可以为两个名字添加两次可选的非捕获组(?:,以匹配空白,并为一个或多个\w+(或者指定一个character class,以匹配多个\w

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

Regex demo

您可以使用asterix *而不是问号?重复非捕获组0次或更多次

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

See regex in use here

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

请注意,在Python中,\w默认情况下匹配像ç这样的特殊字符

只需将\w作为一个组包含空格,就可以捕获单个和完整的名称:

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

Regex101 sample

相关问题 更多 >