2016-01-23 36 views
1

Python 2(使用re模塊)。是否有一種優雅的方式來查看整個字符串是否只包含匹配項?

我想找到這些匹配的字符串,如'</51> < 52>'但我也想檢查這些匹配是否構成整個字符串(注意從正則表達式模式,你也可以看到那'< 66 />'是另一個可以接受的模式)。

match_obj_iter = re.finditer(ur'(</?\d+>)|(<\d+/>)', str) 
for match_obj in match_obj_iter: 
    print('# match found: group |%s|' % (match_obj.group())) 

當然,一個方法是檢查,在每次迭代,該match_obj結束=前match_obj的開始......而第一個是0,而最後LEN(STR)。

我只是想知道是否有更好的正則表達式過程來做到這一點(例如,如果我不需要特別遍歷匹配)。

+3

一個想法是使用re.sub,用''替代你尋找的模式,然後檢查字符串是否爲空。 – Tobias

+0

@TobiasR ...是的,謝謝。 –

回答

1

你可以把你的正則表達式和檢查,這是你的字符串的開始和結束之間存在的唯一的東西檢查:

if re.match(ur'^((</?\d+>)|(<\d+/>))+$', str): 
    print 'Matches the whole string' 
else: 
    print 'Doesn\'t match the whole string' 
+0

請注意,這並不等同於檢查'finditer'的結果是否覆蓋了整個字符串,因爲'finditer'不會通過以前的匹配回溯。例如,'^(aaa | aa)+ $'匹配'aaaa',但使用'aaa'和'finditer'的模式只會匹配'aaaa'的前三個字符。 – user2357112

+0

這是真的,但它應該適用於OP的連續字符串'<...>'的問題。 – Szymon

0

您可以修改正則表達式來做到這一點:

re.match(ur'^(?:(?:</?\d+>)|(?:<\d+/>))+$', str) 

僅當字符串由的一個或多個匹配組成且字符串中沒有其他字符時才匹配。

要找到0個或更多,只需更換+*

re.match(ur'^(?:(?:</?\d+>)|(?:<\d+/>))*$', str) 

注意,我更換了捕獲組像(group)與非捕獲組像(?:group),從而節省內存,使布爾匹配這樣快。

相關問題