Python正则表达式:如何检查字符串中的字符是否在正则匹配的子串范围内?

3 投票
2 回答
1545 浏览
提问于 2025-04-17 02:07

我有一个正则表达式的模式,我用它去处理一大段文本(其实就是一个字符串)。在这段文本中,有几个不连续的地方符合这个正则表达式。现在,我想建立一个状态机,逐个字符地遍历这段文本,根据当前字符的位置和这个位置是否在正则匹配的范围内,做不同的事情。

通过使用 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.

撰写回答