Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式:如何检查字符串中的字符是否在正则表达式匹配的子字符串的范围内?_Python_Regex - Fatal编程技术网

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

Python正则表达式:如何检查字符串中的字符是否在正则表达式匹配的子字符串的范围内?,python,regex,Python,Regex,我有一个正则表达式模式,我在一大块文本(单个字符串)上使用它。原始文本的几个不连续区域与regexp匹配。现在,我正在尝试构建一个状态机,迭代文本并根据某个位置的字符做不同的事情,以及该位置是否在正则表达式匹配范围内 使用RE.finditer(text),我可以找到所有的子字符串,并提取它们的跨度,因此我有一个元组列表可以使用 (1,5) (10, 15) (20, 55), 等等 有了这些信息,给定字符串中字符的索引,我可以编写一个算法来查看该字符是否是正则表达式字符串的一部分。例如,给定字

我有一个正则表达式模式,我在一大块文本(单个字符串)上使用它。原始文本的几个不连续区域与regexp匹配。现在,我正在尝试构建一个状态机,迭代文本并根据某个位置的字符做不同的事情,以及该位置是否在正则表达式匹配范围内

使用RE.finditer(text),我可以找到所有的子字符串,并提取它们的跨度,因此我有一个元组列表可以使用

(1,5) (10, 15) (20, 55), 等等

有了这些信息,给定字符串中字符的索引,我可以编写一个算法来查看该字符是否是正则表达式字符串的一部分。例如,给定字符6,我可以遍历跨度列表并确定它不是匹配子字符串的一部分

有更好的方法吗

提前感谢,


JW

编辑:听起来您想编写自己的解析器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)
中的索引是否位于正则表达式匹配的范围内

字符是任意字符吗?给我们一个具体的例子? 为什么要按每个字符执行此操作?假设您没有按顺序检查多个字符

所需结果是否为布尔值(“是,在某个正则表达式匹配范围内找到了字符”)?对于在正则表达式匹配范围外找到字符的情况,您该怎么办?

Edit 这里有一个正则表达式,它将获取
之间的文本,忽略转义的

(?=<,)(?:[^,]|(?=</),)(?=,)

我有一个状态机,它遍历字符串并根据字符是什么以及字符是否是正则表达式匹配的一部分执行特定操作。例如,如果字符是“”,而不是正则表达式匹配子字符串的一部分,则执行某些操作(所以我想忽略所有的“,”,如果它在由特定正则表达式匹配的子字符串中)。因此,我将处理同一字符的多个实例,并且需要知道它们是否都是正则表达式匹配子字符串的一部分。希望这能澄清问题,谢谢。仍然没有足够的上下文。请发布一个字符串输入和输出的具体示例。为什么要编写通用状态机?这是您的目标还是只是实现n您选择了?为什么要尝试将逗号字符与正则表达式匹配项进行匹配?要解决的具体问题是什么?如果您只想忽略匹配项中的ignoreChars范围,请务必应用
string.translate(…deleteChars)
对他们来说?这只是一个任意的例子:通过aaaaa、bbbb/、ccccc、dddddd扫描,我想保存2“,”之间的字符串,但是/,被认为是一个特殊的转义序列,而不是实际的“,”。所以我迭代字符串,每次遇到“,”时都保存文本,但是,如果“/”,我不想保存文本所以我创建了一个正则表达式来匹配我字符串中的所有转义序列,并且给出了这个信息,每当我的状态机遇到一个“,”时,我都需要知道这个“,”是否是转义序列的一部分。我实际上想保留字符,所以我不能只删除字符。到目前为止,我已经知道我提出的解决方案会起作用,我只是好奇是否有更优雅的解决方案。听起来你想写一个解析器FSM,其中包括标记逗号字符,只有当它们没有转义时。你真的想编写自己的状态机,而不仅仅是语法,让antlr/lex为你创建FSM吗?是的,我的lex/yacc有点模糊:)。当您只需要一个与标识符中转义逗号匹配的正则表达式时,无需编写语法分析器FSM。现在,您想将所有
bbbbbb/、cccccc
捕获为一个令牌还是三个令牌?在一个令牌中,因为如果它们是转义假想的一部分,我将忽略逗号。好的,我在回答中添加了一个这样做的正则表达式。
haystack
?That是sooo PHP
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.