如何使用Python正则表达式从字符串中提取未知数量的不同部分?

时间:2016-02-24 17:07:04

标签: python regex

有没有人知道用Python正则表达式从字符串中提取未知数量的不同部分的聪明方法?

我知道这个问题可能过于笼统而无法回答,所以请让我们看看这个例子:

S = "name.surname@sub1.sub2.sub3"

因此,我想单独获取本地部分和每个子域。请注意,在此示例电子邮件地址中,我们有三个子域,但我希望找到能够捕获任意数量的正则表达式,因此请不要使用此编号。 为了避免偏离这一点,我们假设在电子邮件地址中只允许使用字母数字字符(因此\w),点和一个@。

我试图自己解决这个问题并找到了解决方法:

L = re.findall(r"([\w.]+)(?=@)|(\w+)", S)
for i in L:
    if i[0] == '': print i[1],
    else:          print i[0],
# output: name.surname sub1 sub2 sub3

但它对我来说并不好看。有没有人知道用一个正则表达式和没有任何循环来实现这个目的的方法?

当然,我们可以在没有正则表达式的情况下轻松完成:

L = S.split('@')
localPart = L[0]                  # name.surname
subdomains = str(L[1]).split('.') # ['sub1', 'sub2', 'sub3']

但我对如何用正则表达式解决这个问题很感兴趣。

[编辑]

Uff,最后我想出来了,这是一个很好的解决方案:

S = "name.surname@sub1.sub2.sub3"
print re.split(r"@|\.(?!.*@)", S) # ['name.surname', 'sub1', 'sub2', 'sub3']
S = "name.surname.nick@sub1.sub2.sub3.sub4"
print re.split(r"@|\.(?!.*@)", S) # ['name.surname.nick', 'sub1', 'sub2', 'sub3', 'sub4']

完美的输出。

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的请求,您希望找到示例电子邮件地址中的每个部分,而不是句点。您在示例正则表达式代码段中缺少的是plt.show()。例如:

re.compile

这将在字符串import re s = "name.surname@sub1.sub2.sub3" r = "\w+" r2 = re.compile(r) re.findall(r2,s) 中查找r2正则表达式对象,并输出s

答案 1 :(得分:0)

基本上你可以使用这样一个事实:当模式中有一个捕获组时,['name', 'surname', 'sub1', 'sub2', 'sub3']只返回该捕获组的内容而不再返回整个匹配:

re.findall

显然,电子邮件格式可能比您的示例字符串更复杂。