2

我有一个这样的字符串

--x123-09827--x456-9908872--x789-267504

我试图获得像 123:09827 456:9908872 789:267504 这样的所有价值

我试过 (--x([0-9]+)-([0-9])+)+

但它只给了我最后一对结果,我正在通过 python 测试它

>>> import re
>>> x = "--x123-09827--x456-9908872--x789-267504"
>>> p = "(--x([0-9]+)-([0-9]+))+"
>>> re.match(p,x)
>>> re.match(p,x).groups()
('--x789-267504', '789', '267504')

我应该如何使用嵌套重复模式编写?

非常感谢!

大卫

4

6 回答 6

2

像这样编码:

x = "--x123-09827--x456-9908872--x789-267504"
p = "--x(?:[0-9]+)-(?:[0-9]+)"
print re.findall(p,x)
于 2012-09-13T22:04:16.133 回答
1

试试这个

p='--x([0-9]+)-([0-9]+)'
re.findall(p,x)
于 2012-09-13T22:04:40.190 回答
1

只需使用该.findall方法,它会使表达式更简单。

>>> import re
>>> x = "--x123-09827--x456-9908872--x789-267504"
>>> r = re.compile(r"--x(\d+)-(\d+)")
>>> r.findall(x)
[('123', '09827'), ('456', '9908872'), ('789', '267504')]

您还可以使用.finditerwhich 可能对较长的字符串有帮助。

>>> [m.groups() for m in r.finditer(x)]
[('123', '09827'), ('456', '9908872'), ('789', '267504')]
于 2012-09-13T22:06:01.667 回答
1

使用 re.finditer 或 re.findall。那么您就不需要包裹整个表达式的额外括号了。例如,

    >>> import re
    >>> x = "--x123-09827--x456-9908872--x789-267504"
    >>> p = "--x([0-9]+)-([0-9]+)"
    >>> for m in re.finditer(p,x):
    >>>    print '{0} {1}'.format(m.group(1),m.group(2))
于 2012-09-13T22:11:56.217 回答
0

无需使用正则表达式:

>>> "--x123-09827--x456-9908872--x789-267504".replace('--x',' ').replace('-',':').strip()
'123:09827 456:9908872 789:267504'
于 2012-09-13T22:08:05.927 回答
0

您不需要正则表达式。这是一个简单的单行非正则表达式解决方案:

>>> input = "--x123-09827--x456-9908872--x789-267504"
>>> [ x.replace("-", ":") for x in input.split("--x")[1:] ]
['123:09827', '456:9908872', '789:267504']

如果这是一个关于正则表达式的练习,这里是一个使用重复(技术上)的解决方案,尽管该findall(...)解决方案可能是首选:

>>> import re
>>> input = "--x123-09827--x456-9908872--x789-267504"
>>> regex = '--x(.+)'
>>> [ x.replace("-", ":") for x in re.match(regex*3, input).groups() ]
['123:09827', '456:9908872', '789:267504']
于 2012-09-13T22:41:10.650 回答