我正在使用<[^<>]+>
来提取<
和>
之间的子字符串,如下所示:
<abc>, <?.sdfs/>, <sdsld\>
等
我不是要解析HTML标签或类似的东西。我唯一的问题是在<
和>
之间提取字符串。
但有时候,可能会出现如下的子串:
</</\/\asa></dsdsds><sdsfsa>>
在这种情况下,应匹配所有字符串,而不是3个子字符串。因为所有字符串都由<
和>
覆盖。
如何修改我的正则表达式呢?
答案 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