【问题标题】:Regex python do lookahead in a conditional statement正则表达式 python 在条件语句中进行前瞻
【发布时间】: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 66.4 b-> 匹配,因为第一个和第二个字符串没有相同的“类型”

ab 77 rt -> 不匹配,只需要一个单词字符

R 7.55t -> 不匹配,7.55t 不是有效数字

a r5 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你的问题是为了澄清这些事情。
  • 使用前瞻和条件不是强制性的,这就是我解决问题的方式。
  • 您的正则表达式有错误,当我添加缺少的括号时,正则表达式与我的要求不匹配。您不必使用前瞻、条件语句或/和捕获组。如果没有其他方法可以做到这一点,我很感兴趣。

标签: python regex


【解决方案1】:

命名的捕获组 (?P<var>...) 包含匹配的实际文本,而不是正则表达式本身。也有一种方法可以创建命名的正则表达式;但它在这里可能不是特别必要或有用。

简单地列出备选方案:

((?<![a-zA-Z0-9])[a-zA-Z]s+-?d+(.d+)?(?![a-zA-Z.0-9])|(?<![a-zA-Z.0-9])-?d+(.d+)?s+[a-zA-Z](?![a-zA-Z0-9]))

如果您确实需要第二个令牌保持不匹配,那么如何将每个 s 开始的部分更改为前瞻应该是显而易见的。

演示:https://ideone.com/nPNAIN

【讨论】:

  • 正则表达式包含的括号太多,所以我删除了它,正则表达式没有响应我的请求。
  • 谢谢!这正是我所需要的。我会试着去理解它。
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多