Python正则表达式:如何检查字符串中的字符是否在正则匹配的子串范围内?
我有一个正则表达式的模式,我用它去处理一大段文本(其实就是一个字符串)。在这段文本中,有几个不连续的地方符合这个正则表达式。现在,我想建立一个状态机,逐个字符地遍历这段文本,根据当前字符的位置和这个位置是否在正则匹配的范围内,做不同的事情。
通过使用 RE.finditer(text),我可以找到所有符合条件的子字符串,并提取它们的位置范围。这样,我就得到了一个元组的列表,比如:
(1, 5)
(10, 15)
(20, 55),
等等。
有了这些信息,给定字符串中某个字符的索引,我可以写一个算法来判断这个字符是否属于正则匹配的子字符串。例如,给定字符索引为6,我可以查看这个范围列表,确定它并不在任何匹配的子字符串中。
有没有更好的方法来做到这一点呢?
提前谢谢你,
JW
2 个回答
1
编辑:听起来你想自己写一个解析器状态机(FSM),它的功能之一是处理逗号字符,只有在这些逗号没有被转义的情况下才进行处理。
下面这个正则表达式可以用来匹配一个标识符,可能包含转义的逗号。你可以把它和antlr/lex一起使用:
input = r'aaaaa,bbbb/,ccccc,dddddd,'
pat = re.compile(r'((\w+|/,)+)')
for mat in re.finditer(pat, input):
... do stuff with mat.group(0)
(原始回答:这可能是个不错的解决方案,但你没有提供足够的上下文让我们判断。)
这个字符是出现一次还是多次?如果只出现一次,你可以检查一下从 string.find(char)
返回的索引是否在正则表达式匹配的范围内。
这个字符是任意字符吗?给我们一个具体的例子吧!
你为什么要逐个字符地进行这个操作?你是不是没有顺序地检查多个字符?
你想要的结果是布尔值(‘是的,字符在某个正则匹配的范围内找到了’)吗?如果字符在正则匹配的外面找到了,你会怎么处理?
1
编辑
这里有一个正则表达式,可以提取两个,
之间的文本,同时忽略被转义的,
:
(?=<,)(?:[^,]|(?=</),)(?=,)
原始回答
这里有一些伪代码,应该能满足你的需求:
pattern = re.compile(...)
pos = 0
while (match = pattern.search(haystack, pos)) {
for (i in range(pos, match.start)
//These chars are outside the match.
for (i in group(0))
//The chars are in the match
pos = match.end
//Finish with the rest of the chars not matched
for (i in range(pos, len(haystack))
//These chars are outside the match.