我是Python的初学者,请原谅我,如果我的问题很简单。我想在字符串中找到两个特殊字符之间的多个数据实例,并计算实例数。到目前为止,我有以下代码。
import re
count=0
myString="abcde(fghi)defggdfsidf(ijkl)gfders(gkjh)hgstfvd"
startString = '('
endString = ')'
for item in myString:
portString=myString[myString.find(startString)+len(startString):myString.find(endString)]
print(portString)
count=count+1
我想要的输出是
fghi
ijkl
gkjh
但是我的代码总是从头开始循环并生成fghi。任何人都能告诉我这是什么问题吗?
答案 0 :(得分:1)
你可以使用非贪婪的正则表达式:
count=0
myString="abcde(fghi)defggdfsidf(ijkl)gfders(gkjh)hgstfvd"
rx = re.compile(r'\((.*?)\)') # non greedy version inside parens
pos = 0
while True:
m = rx.search(myString[pos:]) # search starting at pos (initially 0)
if m is None: break
count += 1
print(m.group(1))
pos += m.end() # next search will start past last ')'
上述解决方案只有在圆括号正确平衡或者您想首先打开第一个和下一个首次结束时才有意义。
如果要选择不包含左括号或右括号的文本括号文本,则必须在正则表达式中指定它:
myString="abcde(fghi)defg(gdfsidf(ijkl)g(fders(gkjh)hgstfvd"
rx = re.compile(r'\(([^()]*)\)')
pos = 0
while True:
m = rx.search(myString[pos:]) # search starting at pos (initially 0)
if m is None: break
count += 1
print(m.group(1))
pos += m.end() # next search will start past last ')'
答案 1 :(得分:0)
作为正则表达式的替代方案,如果您更喜欢保持循环,请注意AsyncTask
可以使用可选参数来告诉它从哪里开始查找。只需跟踪右括号的位置,然后再从那里开始。
不幸的是,它不是那么简单,因为循环条件也必须改变,所以它在击中最后一组括号后停止。
这样的事情可以解决问题:
String.find()
输出:
count=0
myString="abcde(fghi)defggdfsidf(ijkl)gfders(gkjh)hgstfvd"
startString = '('
endString = ')'
endStringIndex = 0
while True:
startStringIndex = myString.find(startString, endStringIndex+1)
endStringIndex = myString.find(endString, endStringIndex+1)
if (startStringIndex == -1):
break
portString=myString[startStringIndex+len(startString):endStringIndex]
print(portString)
count+=1
答案 2 :(得分:0)
您可以使用re.findall
:
>>> myString = "abcde(fghi)defggdfsidf(ijkl)gfders(gkjh)hgstfvd"
>>> matches = re.findall(r'\((\w+)\)', myString)
>>> count = len(matches)
>>> print('\n'.join(matches))
fghi
ijkl
gkjh
>>> print(count)
3