【问题标题】:How to fetch names using RegEx for given pattern?如何使用 RegEx 获取给定模式的名称?
【发布时间】:2018-12-27 09:50:09
【问题描述】:

我正在尝试使用 RegEx 从文本中获取以下模式:

John Doe
JOHN DOE
Sam John Watson
Sam John Lilly Watson
SAM JOHN WATSON
SAM JOHN LILLY WATSON

输入数据仅包含单行,我需要在其中找到上述模式。

更多关于模式

  • 每个单词都以大写字母开头,后跟大写或小写
  • 最少 2 个字
  • 最多 4 个字
  • 单词将仅包含 A-Z 或 a-z 字符

我尝试了什么:

import re
re.findall("[A-Z][A-Za-z]+ [A-Z][A-Za-z]+ [A-Za-z]* [A-Za-z]*", text)

这将正确识别输入,例如:

Sam Peters John Doe
SAM WINCH DAN BROWN

但输入少于 4 个单词时失败。

【问题讨论】:

标签: python regex


【解决方案1】:

您的模式失败了,因为即使在最后两个字符集之后使用*s,最后两个字符集旁边的空格不是可选的。因此(例如)字符串中只有 2 个单词只有在这两个单词后面跟着 两个空格 时才会匹配。

我建议您以[A-Z][A-Za-z]+ 开头的第一个单词,然后在一个单词之后重复一个空格,最多重复 3 次:

^[A-Z][A-Za-z]+(?: [A-Z][A-Za-z]+){1,3}$

https://regex101.com/r/IvSvAH/1

如果有可能只有一个字符的单词(如“I”或“A”),则使用* 而不是+ 重复[A-Za-z] 字符集。

【讨论】:

  • 就像一个魅力。如果您指出我的解决方案在这种情况下失败的原因会更有帮助。
  • @Sociopath 我可能还会建议一个新用户名。但是对此答案 +1。
猜你喜欢
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2020-06-04
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多