如何在 Python 中编写通用/灵活的正则表达式?

如何解决如何在 Python 中编写通用/灵活的正则表达式?

我正在学习正则表达式。如您所知,人们可能有中间名,也可能没有。我想写一个灵活的正则表达式,以便将来编译和使用。但是,我无法这样做。任何建议和/或帮助将不胜感激。下面是我没有中间名的名字的正则表达式。

import re
p = re.compile(r"\W+\s+(?P<firstname>\w+)\s+(?P<lastname>\w+)")
name = "John Drell"
m = p.search(name)

我对没有中间名的名字没有任何问题。但是,我无法为可能有或没有中间名的名字写出正确的灵活。这是我的测试代码之一。

import re
p = re.compile(r"\W+\s+(?P<firstname>\w+)\s+(?:P<middlename>[A-Z]*)(?P<lastname>\w+)")
name = "John M. Drell"
m = p.search(name)

这个脚本只允许有中间名的名字,否则我会收到错误信息:'NonType' object has no attribute 'groups'。

如果你能纠正我,我非常感谢。

解决方法

使用split()

names = ["John M. Drell","John Drell"]
for name in names:
    firstname,*middlenames,lastname = name.split()
    print(f'First name: {firstname},Middle name(s): {" ".join(middlenames)},Last name: {lastname}')

Python proof

通过正则表达式,学习使用可选组和 \S 来匹配任何非空白字符:

^(?P<firstname>\S+)(?:\s+(?P<middlename>\S+(?: +\S+)*))?\s+(?P<lastname>\S+)$

regex proof

说明

--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (?P<firstname>           group and capture to "firstname":
--------------------------------------------------------------------------------
    \S+                      non-whitespace (all but \n,\r,\t,\f,and " ") (1 or more times (matching the
                             most amount possible))
--------------------------------------------------------------------------------
  )                        end of "firstname"
--------------------------------------------------------------------------------
  (?:                      group,but do not capture (optional
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    \s+                      whitespace (\n,and " ") (1
                             or more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    (?P<middlename>            group and capture to "middlename":
--------------------------------------------------------------------------------
      \S+                      non-whitespace (all but \n,and " ") (1 or more times
                               (matching the most amount possible))
--------------------------------------------------------------------------------
      (?:                      group,but do not capture (0 or more
                               times (matching the most amount
                               possible)):
--------------------------------------------------------------------------------
         +                       ' ' (1 or more times (matching the
                                 most amount possible))
--------------------------------------------------------------------------------
        \S+                      non-whitespace (all but \n,and " ") (1 or more times
                                 (matching the most amount possible))
--------------------------------------------------------------------------------
      )*                       end of grouping
--------------------------------------------------------------------------------
    )                        end of "middlename"
--------------------------------------------------------------------------------
  )?                       end of grouping
--------------------------------------------------------------------------------
  \s+                      whitespace (\n,and " ") (1 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  (?P<lastname>             group and capture to "lastname":
--------------------------------------------------------------------------------
    \S+                      non-whitespace (all but \n,and " ") (1 or more times (matching the
                             most amount possible))
--------------------------------------------------------------------------------
  )                        end of "lastname"
--------------------------------------------------------------------------------
  $                        before an optional \n,and the end of the
                           string

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?