Python中的复杂正则表达式
我正在尝试使用regex编写一个通用模式,以便它只从字符串中获取特定的内容。假设我们有GigabitEthernet0/0/0/0或FastEthernet0/4或Ethernet0/0.222这样的字符串。正则表达式应该获取前2个字符和所有数字。因此,根据上述情况,获取的结果应该类似于Gi0000或Fa04或Et00222Python中的复杂正则表达式,python,regex,Python,Regex,我正在尝试使用regex编写一个通用模式,以便它只从字符串中获取特定的内容。假设我们有GigabitEthernet0/0/0/0或FastEthernet0/4或Ethernet0/0.222这样的字符串。正则表达式应该获取前2个字符和所有数字。因此,根据上述情况,获取的结果应该类似于Gi0000或Fa04或Et00222 x = 'GigabitEthernet0/0/0/2 m = re.search('([\w+]{2}?)[\\\.(\d+)]{0,}',x) 我不明白该如何写正则表
x = 'GigabitEthernet0/0/0/2
m = re.search('([\w+]{2}?)[\\\.(\d+)]{0,}',x)
我不明白该如何写正则表达式。这些值也可以以列表的形式获取。我写了更多的模式,但没有帮助。在正则表达式中,您可以使用
re.findall
函数
>>> import re
>>> s = 'GigabitEthernet0/0/0/0 '
>>> s[:2]+''.join(re.findall(r'\d', s))
'Gi0000'
或
或
在正则表达式中,可以使用
re.findall
函数
>>> import re
>>> s = 'GigabitEthernet0/0/0/0 '
>>> s[:2]+''.join(re.findall(r'\d', s))
'Gi0000'
或
或
您可以试试这个。这将确保只有来自尾端的数字起作用
您可以尝试此操作。这将确保只有末端的数字起作用。这里是另一个选项:
s='Ethernet0/0.222'
“.join(关于findall('^\w{2}|[\d]+',s))
这里是另一个选项:
s='Ethernet0/0.222'
“.join(关于findall('^\w{2}|[\d]+',s))
您可以使用s[:2]
和join
中的列表理解来获得更高的性能,您只需将上一代exp转换为列表comp.)正如Kasra所说,这样可以获得更好的性能。这是因为join
必须扫描它的iterable arg两次-第一次扫描是确定它需要分配的字符串的大小。因此,如果你给它传递一个生成器,它必须在加入它之前将其构建到一个列表中。很多人不知道这一点。:)因此,我将留下这条评论,以供未来读者参考,即使您现在已经修复了它。您可以使用s[:2]
和join
中的列表理解来获得更高的性能,您只需将最后一代exp转换为列表comp.:)正如Kasra所说,这样可以获得更好的性能。这是因为join
必须扫描它的iterable arg两次-第一次扫描是确定它需要分配的字符串的大小。因此,如果你给它传递一个生成器,它必须在加入它之前将其构建到一个列表中。很多人不知道这一点。:)因此,我将留下这条评论,以供将来的读者参考,即使您现在已经修复了它。如果您要处理大量字符串,您应该使用正则表达式-这比在循环中重复创建相同的正则表达式要高效得多。@PM2Ring非常感谢,这将非常有帮助:)如果你要处理很多字符串,你应该使用你的正则表达式-这比在循环中反复创建同一个正则表达式要高效得多。@PM2Ring非常感谢,这将非常有帮助:)但是从OP来看,Vipul似乎想要所有的数字,例如Ethernet0/0.222
->Et00222
@PM2Ringgig9abiteEthernet0/0/0/2
我认为OP不想从这个例子中得到9
。他应该澄清一下though@Vipulgig9abiteEthernet0/0/0/2
的预期输出是什么?您想要9
吗?但从OP上看,Vipul想要所有数字,例如Ethernet0/0.222
->Et00222
@PM2Ringgig9abiteEthernet0/0/0/2
我认为OP不想从这个例子中得到9
。他应该澄清一下though@Vipulgig9abiteEthernet0/0/0/2的预期输出是什么
您想要9
在这里吗?
>>> s = 'GigabitEthernet0/0/0/0 '
>>> s[:2]+''.join([i for i in s if i.isdigit()])
'Gi0000'
z="Ethernet0/0.222."
print z[:2]+"".join(re.findall(r"(\d+)(?=[\d\W]*$)",z))