【发布时间】:2022-11-12 19:04:49
【问题描述】:
我正在尝试在条件语句中进行前瞻。 文字解释:
(specified string that has to be a number (decimal or not) or a word character, a named capturing group is created) (if the named capturing group is a word character then check if the next string is a number (decimal or not) with a lookahead else check if the next string is a word character with a lookahead)
为了理解,这里有一些匹配或不匹配的例子:
a 6 或 6.4 b-> 匹配,因为第一个和第二个字符串没有相同的“类型”
ab 7 或 7 rt -> 不匹配,只需要一个单词字符
R 7.55t -> 不匹配,7.55t 不是有效数字
a r或5 6->不匹配,第一个和第二个字符串的“类型”相同(数字和数字,或者,字字符和字字符)
我已经找到了第一个字符串的答案:(?P<var>([a-zA-Z]|(-?\d+(.\d+)?)))
我在 Internet 上找不到任何关于 Python 条件语句中的前瞻的信息。
问题是 Python 不支持 PCRE 之类的条件语句:
Python 支持使用编号或命名的捕获组的条件。 Python 不支持使用环视的条件,即使 Python 确实支持条件外的环视。您可以交替使用两个相反的环顾四周:(?=regex)then|(?!regex)else,而不是像 (?(?=regex)then|else) 这样的条件。 (来源:https://www.regular-expressions.info/conditional.html)
也许我已经计划了一个更好的解决方案,或者也许只是不可能做我想做的事,我不知道。
我试过的方法:(?P<var>([a-zA-Z]|(-?\d+(.\d+)?))) (?(?=[a-zA-Z])(?=(-?\d+(.\d+)?))|(?=[a-zA-Z]))(?P=var) 但这不起作用。
【问题讨论】:
-
你的介绍有点乱。不清楚你为什么要求具有前瞻性和条件的解决方案。
(?P<number1>[\d.]+)\s+(?P<char1>\w(?!\w)|(?P<char2>\w(?!\w))\s+(?P<number2>[\d.]+)将匹配这两种情况,并为您提供命名组,以指示确切匹配的内容。 -
\w包含数字,我的浮点表达式显然是草率的。也许edit你的问题是为了澄清这些事情。 -
使用前瞻和条件不是强制性的,这就是我解决问题的方式。
-
您的正则表达式有错误,当我添加缺少的括号时,正则表达式与我的要求不匹配。您不必使用前瞻、条件语句或/和捕获组。如果没有其他方法可以做到这一点,我很感兴趣。