使用正则表达式提取具有特殊字符的文本 python

Extract text with special characters using regex python

我有一系列格式为 firstname.lastname@gmail.com 的电子邮件。

我想使用正则表达式获取名字、姓氏和域名。

我可以像这样获取域:

domain = re.search('@.+', email).group()

但是我的名字和姓氏有问题。

您好,您能告诉我怎么做吗?

您需要在正则表达式中使用括号,以便访问匹配的子字符串。请注意,下面的正则表达式中有三个括号,分别用于匹配名字、姓氏和域。

m = re.match(r'(.*)\.(.*)@(.*)', email)
assert m is not None
firstname = m.group(1)
lastname = m.group(2)
domain = m.group(3)

另外两个注意事项:

  1. 您需要使用反斜杠转义分隔名字和姓氏的点。
  2. 对正则表达式字符串使用前缀 r 很方便,以避免重复反斜杠字符。
v = "firstname.lastname@gmail.com"
pattern = re.compile(r"(.*)\.(.*)@([a-z]+)\.[a-z]+")
pattern.findall(v)

pattern.findall(v)
Out[7]: [('firstname', 'lastname', 'gmail')]

输出将是一个由名字、姓氏和域组成的元组。

如果你想使用 3 个捕获组,你可以使用否定字符 class 来匹配除你想要允许的字符以外的所有字符,以防止一些不必要的回溯使用 .*

^([^\s@.]+)\.([^\s@.]+)@([^\s@]+)$

在部分中,模式匹配:

  • ^ 字符串开头
  • ([^\s@.]+) 捕获 组 1 匹配除空白字符 .@
  • 以外的 1+ 个字符
  • \.匹配一个点
  • ([^\s@.]+) 捕获 组 2 匹配除空白字符 .@
  • 以外的 1+ 个字符
  • @ 匹配一个 @ 字符
  • ([^\s@]+) 捕获 组 3 匹配除 whitspace 字符或 @
  • 以外的 1+ 个字符
  • $ 字符串结束

看到一个regex demo and a Python demo.

例如:

import re

email = "firstname.lastname@gmail.com";
m = re.match(r'([^\s@.]+)\.([^\s@.]+)@([^\s@]+)$', email)
if m:
    print(m.groups())

输出

('firstname', 'lastname', 'gmail.com')