我试图使用正则表达式在2个分隔符之间找到多次出现。 不幸的是,我无法弄清楚如何。 2个分隔符是'和':
import re
string = "'lightOff' 'lightOn':,'lightOff' 'ovenOff' 'ovenOn': None 'radioOn': 'radioOff'"
print string
print 'newString', re.findall("^'(.*?)':", string)
我只得到第一场比赛
'lightOn'
我想要的是获得'之间的3个子串。和':
'lightOn'
'ovenOn'
'radioOn'
答案 0 :(得分:1)
不要使用锚。 ^
和$
是正则表达式模式中的锚点。此外,当您在两个'
之间进行匹配时,它会返回字符串'word1' 'word2':
作为输出,而不仅仅是'word2':
。尝试匹配两个'
之间的所有内容,而不是字符'
本身。
re.findall("'([^']+)':", string)
会奏效。
答案 1 :(得分:0)
我想要的是获得'之间的3个子串。和'
尝试不使用Lookaround和Character class
捕获群组(?<=')[^']+(?=':)
这是demo
✽ Want to Be Lazy? Think Twice.
关于效果和追溯
然而,一个惰性量词有
cost
:在大括号内的每一步,引擎首先尝试延迟选项(匹配无字符),然后尝试匹配下一个标记(右大括号),然后必须回溯。因此,惰性量词在每一步都会导致backtracking
。
答案 2 :(得分:0)
以下正则表达式也可以,
'[^']*'(?=:)
python代码将是,
>>> import re
>>> string = "'lightOff' 'lightOn':,'lightOff' 'ovenOff' 'ovenOn': None 'radioOn': 'radioOff'"
>>> m = re.findall(r"'[^']*'(?=:)", string)
>>> for i in m:
... print i
...
'lightOn'
'ovenOn'
'radioOn'
如果您不想在最终结果中加入'
,请使用前瞻和后视。
>>> m = re.findall(r"(?<=')[^']*(?=':)", string)
>>> for i in m:
... print i
...
lightOn
ovenOn
radioOn