不同形式的人名表示的正则表达式

时间:2018-09-29 22:04:30

标签: python regex

我正在编写一个python正则表达式,试图捕获人们的名字。

它们可以采用 first_name last_name last_name, first_name 的形式。

这是我的正则表达式:

(?P<first>\w+) (?P<last>\w+)|(?P<last>\w+), (?P<first>\w+)

但是,这会导致子模式命名错误。有办法解决吗?

2 个答案:

答案 0 :(得分:0)

尝试这样的事情,
请注意,Python需要唯一的捕获组名称。

import Torello.HTML.*; public class Scrape { public static void main(String[] argv) throws IOException { Vector<HTMLNode> page = HTMLPage.getPageTokens(new java.net.URL("Your-URL"), false); int pos = InnerTagFind.first(page, "div", "class", TextTester.EQ, "div-class-constraint"); HTMLNode n; // This will print all Text that follows the particular HTML <DIV CLASS="..."> // View the scrape class documentation for other functions. for (int i=pos; i < page.size(); i++) if ((n = page.elementAt(i)) instanceof TextNode) System.out.println(n.str); }

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

r"(?P<first1>\w+)[ ](?P<last1>\w+)|(?P<last2>\w+),[ ](?P<first2>\w+)"

答案 1 :(得分:0)

您只能使用PyPi regex module做您想做的事,因为它允许在单个模式中使用相同的命名捕获组:

import regex
sz = ["first_name last_name","last_name, first_name"]
for s in sz:
    print(regex.search(r'(?P<first>\w+) (?P<last>\w+)|(?P<last>\w+), (?P<first>\w+)', s).groupdict())
# => {'last': 'last_name', 'first': 'first_name'}
# => {'last': 'last_name', 'first': 'first_name'}

请参见Python demo

否则,如果您的输入始终像这样,则可以交换名字和姓氏并删除逗号,然后仅拆分字符串:

name, surname = re.sub(r'^(\w+),\s+(\w+)$', r'\2 \1', s).split()
# => first_name last_name
# => first_name last_name

请参见another Python demo

Another alternative:使用具有规则轮换的简单编号的捕获组,然后将相应的捕获连接起来:

import re
sz = ["first_name last_name","last_name, first_name"]
for s in sz:
    m = re.search(r'(\w+),\s+(\w+)|(\w+)\s+(\w+)', s)
    if m:
        surname = "{}{}".format(m.group(1) or '', m.group(4) or '')
        name = "{}{}".format(m.group(2) or '', m.group(3) or '') 
        print("{} {}".format(name, surname))
    else:
        print("No match")

在这里,r'(\w+),\s+(\w+)|(\w+)\s+(\w+)'在组1或4中具有姓氏,在组2或3中具有姓氏,加入这些组之后,您将获得匹配项(其中一个始终为None,因此{连接时需要{1}}。