繁体   English   中英

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

[英]How to extract unknown number of different parts from string with 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']

但是我对如何使用正则表达式感兴趣。

[编辑]

乌夫,终于我弄清楚了,这是一个不错的解决方案:

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']

完美的输出。

如果我正确地理解了您的请求,则希望在示例电子邮件地址中找到每个部分,但不要加上句点。 样本正则表达式片段中缺少的是re.compile 例如:

import re
s = "name.surname@sub1.sub2.sub3"
r = "\w+"
r2 = re.compile(r)
re.findall(r2,s)

这将在字符串s查找r2正则表达式对象,并输出['name', 'surname', 'sub1', 'sub2', 'sub3']

基本上,您可以使用以下事实:当模式中存在捕获组时, re.findall仅返回此捕获组的内容, re.findall返回整个匹配项:

>>> re.findall(r'(?:^[^@]*@|\.)([^.]*)', s)
['sub1', 'sub2', 'sub3']

显然,电子邮件格式比示例字符串要复杂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM