贪婪和非贪婪的正则表达式根本不够

时间:2019-08-20 05:58:45

标签: regex python-3.x

我在匹配问题所在的字符串中匹配某些内容时遇到问题 (re.findall()),它只允许我匹配贪婪或非贪婪,而我想匹配贪婪和非贪婪之间的事物,例如:

import re
text = "f(s(5)+5)+f(12)"
regex = re.findall("f\(.*\)", text)

>>>['f(s(5)+5)+f(12)']

这是贪婪的,将匹配整个字符串。 另一个例子:

import re
text = "f(s(5)+5)+f(12)"
regex = re.findall("f\(.*?\)", text)

>>>['f(s(5)', 'f(12)']

这是非贪婪的,将匹配某些部分,但不够用 我想匹配所有贪婪和非贪婪,它们之间的匹配就像

>>> ['f(s(5)', 'f(s(5)+5)', 'f(12), 'f(s(5)+5)+f(12)']

看到非贪婪和贪婪中缺少一个匹配项 'f(s(5)+5)',如果字符串较大,则会丢失多个。

1 个答案:

答案 0 :(得分:1)

是的,就像每个人都已经说过的那样,没有直接的正则表达式可以为您提供所需的输出。

但是通过正则表达式上的循环,我能够实现所需的输出。看看是否有帮助。

import re
text = "f(s(5)+5)+f(12)"
print ("occurences of ')' : {}".format(text.count(")")))

test_str = text
# loop repeatedly until all substrings starting with 'f(' are parsed
while test_str:
    # for loop: to parse all ')'
    for i in range(1,test_str.count(")")+1):
        # regex explanation can be found @ https://regex101.com/r/jJOXr0/1/
        regex = r'^f\((?:.*?\)){' + re.escape(str(i)) + r'}'
        output_list = re.findall(regex, test_str)
        print(output_list[0])

    # find the next substring starting with 'f('
    substr_id = test_str.find('f(',1)
    if substr_id == -1:
        break
    else:
        test_str = test_str[substr_id:]


Output :
occurences of ')' : 3
f(s(5)
f(s(5)+5)
f(s(5)+5)+f(12)
f(12)