[英]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.