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')]

.finditer長い文字列に役立つ可能性のあるものを使用することもできます。

>>> [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 に答える