如何将正则表达式与模式和任意次数相匹配?

时间:2013-07-09 16:16:01

标签: python regex string parsing tokenize

我目前的正则表达式定义如下:

>>> import re
>>> regex = re.compile("(\d+:)+(\d+)")
>>> search_results = regex.search("52345:54325432:555:443:3:33")
>>> search_results.groups()
('3:', '33')

我知道我能做到

>>> "52345:54325432:555:443:3:33".split(":")

将每个项目拆分为令牌,但我想知道如何使用正则表达式实现此目的。

4 个答案:

答案 0 :(得分:1)

如果您希望所有匹配项re.findall在第一场比赛时停止,请使用re.search

>>> strs = "52345:54325432:555:443:3:33"
>>> re.findall(r"(\d+):(\d+)",strs)
[('52345', '54325432'), ('555', '443'), ('3', '33')]

如果您想要与str.split完全相同的结果,那么您可以这样做:

>>> re.split(r":",strs)
['52345', '54325432', '555', '443', '3', '33']
>>> re.findall(r"[^:]+",strs)
['52345', '54325432', '555', '443', '3', '33']

答案 1 :(得分:0)

看看这是否有帮助......

>>> pat = r'(\d+(?=\:)|\d+$)'
>>> regexp = re.compile(pat)
>>> m = regexp.findall("52345:54325432:555:443:3:33")
>>> m
['52345', '54325432', '555', '443', '3', '33']
>>>

答案 2 :(得分:0)

您应该使用split来解决此问题。

findall可以处理任何有效的字符串。不幸的是,它也适用于任何无效的字符串。如果这就是你想要的,那很好;但可能你想知道是否有错误。

示例:

>>> import re
>>> digits = re.compile("\d+")
>>> digits.findall("52345:54325432:555:443:3:33")
['52345', '54325432', '555', '443', '3', '33']
>>> digits.findall("52345:54325.432:555:443:3:33")
['52345', '54325', '432', '555', '443', '3', '33']
>>> digits.findall(""There are 2 numbers and 53 characters in this string."")
['2', '53']

当然,如果您决定只使用re模块,则可以先匹配然后拆分:

>>> valid = re.compile("(?:\d+:)*\d+$")
>>> digits = re.compile("\d+")
>>> s = "52345:54325432:555:443:3:33"
>>> digits.findall(s) if valid.match(s) else []

相反:

>>> [int(n) for n in "52345:54325432:555:443:3:33".split(":")]
[52345, 54325432, 555, 443, 3, 33]
>>> [int(n) for n in "52345:54325.432:555:443:3:33".split(":")]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '54325.432'

>>> [int(n)
...  for n in "There are 2 numbers and 53 characters in this string.".split(":")]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10:
  'There are 2 numbers and 53 characters in this string.'

答案 3 :(得分:0)

(?<test>[0-9]+):

这是正则表达式。你需要做的是: 例如你的字符串在str:

var str = "52345:54325432:555:443:3:33";

然后你必须在while循环

中匹配这个字符串和正则表达式
while(RegexMatch.Success){

//这里的操作 }

第一个值:即:52345将在:

var first = RegexMatch.Groups["test"].Value;

首次更改。

注意:这不是与Regex等匹配的确切代码,而是伪代码。希望你能理解。我附加图像以显示正则表达式中的组。 enter image description here