我爲了<
和>
之間抽取子,如下面的使用<[^<>]+>
:邊界字符串
<abc>, <?.sdfs/>, <sdsld\>
等
我不是試圖解析HTML標籤,或相似的東西。我唯一的問題是提取<
和>
之間的字符串。
但有時候,有可能是子像下面這樣:
</</\/\asa></dsdsds><sdsfsa>>
在這種情況下,所有的字符串應該匹配,而不是3子。因爲所有字符串都被<
和>
覆蓋。
如何修改我的正則表達式來做到這一點?
我爲了<
和>
之間抽取子,如下面的使用<[^<>]+>
:邊界字符串
<abc>, <?.sdfs/>, <sdsld\>
等
我不是試圖解析HTML標籤,或相似的東西。我唯一的問題是提取<
和>
之間的字符串。
但有時候,有可能是子像下面這樣:
</</\/\asa></dsdsds><sdsfsa>>
在這種情況下,所有的字符串應該匹配,而不是3子。因爲所有字符串都被<
和>
覆蓋。
如何修改我的正則表達式來做到這一點?
請勿使用正則表達式。使用傳統的方式來做到這一點。做一個堆棧,如果有多個'<'繼續追加其他的中斷並追加整個事情。
但只要確保處理雙反斜線,不知怎的,突然出現: -/
def find_tags(your_string)
ans = []
stack = []
tag_no = 0
for c in your_string:
if c=='<':
tag_no+=1
if tag_no>1:
stack.append(c)
elif c=='>':
if tag_no==1:
ans.append(''.join(stack))
tag_no=0
stack=[]
else:
tag_no = tag_no-1
stack.append(c)
elif tag_no>0:
stack.append(c)
return ans
輸出下面
find_tags(r'<abc>, <?.sdfs/>, <sdsld\>')
['abc', '?.sdfs/', 'sdsld\\']
find_tags(r'</</\/\asa></dsdsds><sdsfsa>>')
['/</\\/\\asa></dsdsds><sdsfsa>']
注:工作在O(n)的爲好。
abhishek,我想包括< and >。 – yusuf
請參閱本 Regular Expression to match outer brackets 我試圖使用<
& >
實現相同。
或者怎麼樣在這個小方法:
def recursive_bracket_parser(s, i):
while i < len(s):
if s[i] == '<':
i = recursive_bracket_parser(s, i+1)
elif s[i] == '>':
return i+1
else:
# process whatever is at s[i]
i += 1
return i
這樣的字符串是不是正規語言的一部分,所以正則表達式可能是錯誤的做法。 – Xufox
根據您使用的語言,有特殊的正則表達式來完成它。例如C#有一個(http://stackoverflow.com/questions/17003799/what-are-regular-expression-balancing-groups) – xanatos
@xanatos,我正在使用python。 – yusuf