Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的复杂正则表达式_Python_Regex - Fatal编程技术网

Python中的复杂正则表达式

Python中的复杂正则表达式,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) 我不明白该如何写正则表

我正在尝试使用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)

我不明白该如何写正则表达式。这些值也可以以列表的形式获取。我写了更多的模式,但没有帮助。

在正则表达式中,您可以使用
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
@PM2Ring
gig9abiteEthernet0/0/0/2
我认为OP不想从这个例子中得到
9
。他应该澄清一下though@Vipul
gig9abiteEthernet0/0/0/2
的预期输出是什么?您想要
9
吗?但从OP上看,Vipul想要所有数字,例如
Ethernet0/0.222
->
Et00222
@PM2Ring
gig9abiteEthernet0/0/0/2
我认为OP不想从这个例子中得到
9
。他应该澄清一下though@Vipul
gig9abiteEthernet0/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))