我正在编写一个python正则表达式,试图捕获人们的名字。
它们可以采用 first_name last_name
或 last_name, first_name
的形式。
这是我的正则表达式:
(?P<first>\w+) (?P<last>\w+)|(?P<last>\w+), (?P<first>\w+)
但是,这会导致子模式命名错误。有办法解决吗?
答案 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 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}}。