2017-03-08 173 views
1

我爲了<>之間抽取子,如下面的使用<[^<>]+>邊界字符串

<abc>, <?.sdfs/>, <sdsld\>

我不是試圖解析HTML標籤,或相似的東西。我唯一的問題是提取<>之間的字符串。

但有時候,有可能是子像下面這樣:

</</\/\asa></dsdsds><sdsfsa>> 

在這種情況下,所有的字符串應該匹配,而不是3子。因爲所有字符串都被<>覆蓋。

如何修改我的正則表達式來做到這一點?

+2

這樣的字符串是不是正規語言的一部分,所以正則表達式可能是錯誤的做法。 – Xufox

+1

根據您使用的語言,有特殊的正則表達式來完成它。例如C#有一個(http://stackoverflow.com/questions/17003799/what-are-regular-expression-balancing-groups) – xanatos

+0

@xanatos,我正在使用python。 – yusuf

回答

1

請勿使用正則表達式。使用傳統的方式來做到這一點。做一個堆棧,如果有多個'<'繼續追加其他的中斷並追加整個事情。

但只要確保處理雙反斜線,不知怎的,突然出現: -/

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)的爲好。

+0

abhishek,我想包括< and >。 – yusuf