5

私は次のような文字列でとを分離しようとしてい[0-9]ます[A-Z]

100M
20M1D80M
20M1I79M
20M10000N80M

Pythonreモジュールを使用してみましたが、使用したコードは次のとおりです。

>>>import re
>>>num_alpha = re.compile('(([0-9]+)([A-Z]))+')
>>>str1="100M"
>>>n_a_match = num_alpha.match(str1)
>>>n_a_match.group(2), n_a_match.group(3)

100,M   #just what I want

>>>str1="20M10000N80M"
>>>n_a_match = num_alpha.match(str1)
>>>n_a_match.groups()

('80M', '80', 'M')  #only the last one, how can I get the first two?
#expected result ('20M','20','M','10000N','10000','N','80M','80','M')

この正規表現は、一致が1つだけ含まれているが、一致のグループが複数含まれていない文字列に適しています。正規表現を使用してそれを処理するにはどうすればよいですか?

4

3 に答える 3

3

split次の方法を使用してみてください。

>>> str1="20M10000N80M"
>>> num_alpha = re.compile('(([0-9]+)([A-Z]))')
>>> l = num_alpha.split(str1)
>>> l
['', '20M', '20', 'M', '', '10000N', '10000', 'N', '', '80M', '80', 'M', '']

+正規表現でを削除したことに注意してください。

そして、空の文字列を削除するには、リストジェネレーターを使用します。

>>> l_without_empty = [x for x in l if x != '']
['20M', '20', 'M', '10000N', '10000', 'N', '80M', '80', 'M']

編集:

または、コメントで述べたように:

>>> l_without_empty = [x for x in l if x]
['20M', '20', 'M', '10000N', '10000', 'N', '80M', '80', 'M']
于 2013-02-27T03:02:33.977 に答える
3

を使用することをお勧めしre.findallます。リストを作成するのではなく、結果を反復処理する場合は、re.finditer代わりに使用できます。これがどのように機能するかの例です:

>>> re.findall("(([0-9]+)([A-Z]))", "20M10000N80M")
[('20M', '20', 'M'), ('10000N', '10000', 'N'), ('80M', '80', 'M')]

数字と文字の組み合わせの文字列が必要ない場合は、一致から外側の括弧を削除して、個別の部分を取得することができます。

>>> re.findall("([0-9]+)([A-Z])", "20M10000N80M")
[('20', 'M'), ('10000', 'N'), ('80', 'M')]

または、タプルがまったく必要ない場合(および、複数の文字が連続している文字列など、不正な入力について心配する必要がない場合)、パターンを交互に変更して、値を1つずつ取得できます。 1:

>>> re.findall("([0-9]+|[A-Z])", "20M10000N80M")
['20', 'M', '10000', 'N', '80', 'M']
于 2013-02-27T03:41:16.333 に答える
2

別の選択肢は、代わりに行くことですre.findall

>>> string = "20M10000N80M"
>>> groups = re.findall(r'((\d+)(\D+))', string)
[('20M', '20', 'M'), ('10000N', '10000', 'N'), ('80M', '80', 'M')]

したがって、さまざまなグループがタプルとして返されるのを確認できます。次に、提示するときにタプルとして本当に必要な場合は、フラット化できます。

>>> from itertools import chain
>>> tuple(chain.from_iterable(groups))
('20M', '20', 'M', '10000N', '10000', 'N', '80M', '80', 'M')
于 2013-02-27T03:42:47.990 に答える