簡體   English   中英

如何使用正則表達式分隔字符串中的數字和字符,如“30M1000N20M”

[英]How to use regular expression to separate numbers and characters in strings like “30M1000N20M”

我試圖將字符串中的[0-9][AZ]分開:

100M
20M1D80M
20M1I79M
20M10000N80M

我嘗試使用Python re模塊,以下是我使用的代碼:

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

此正則表達式適用於僅包含一個匹配但不包含多個匹配組的字符串。 如何使用正則表達式處理它?

嘗試使用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']

我建議使用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')]

或者,如果您根本不需要元組(並且您不需要擔心格式錯誤的輸入,例如連續多個字母的字符串),您可以將模式更改為交替,並通過一個或多個獲取值一:

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

另一種選擇是改為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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM