[英]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.