我在匹配问题所在的字符串中匹配某些内容时遇到问题 (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)',如果字符串较大,则会丢失多个。
答案 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)