正则表达式

时间:2017-03-08 08:53:36

标签: python regex string

我正在使用<[^<>]+>来提取<>之间的子字符串,如下所示:

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

我不是要解析HTML标签或类似的东西。我唯一的问题是在<>之间提取字符串。

但有时候,可能会出现如下的子串:

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

在这种情况下,应匹配所有字符串,而不是3个子字符串。因为所有字符串都由<>覆盖。

如何修改我的正则表达式呢?

2 个答案:

答案 0 :(得分:1)

不要使用正则表达式。使用传统方式执行此操作。堆叠,如果有多个'&lt;'继续追加其他破坏并追加整个事物。

但是只要确保处理以某种方式突然出现的双反斜杠: - /

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

答案 1 :(得分:1)

参考这个 Regular Expression to match outer brackets 我正在尝试使用<&amp; >

或者这个小方法怎么样:

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

来源:How can I match nested brackets using regex?