忽略引号中的模式的正则表达式(Python或R)

2024-10-03 11:25:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个regex,它允许我找到一个字符串的实例,其中我有一个无空格的/ 例如:

some characters/morecharacters

我想出了下面的表达式,它允许我在/之前查找单词字符或右括号,然后查找单词字符或左括号字符。在

^{pr2}$

这在大多数情况下都很有用,但是当我在引号中加上/时,我就不方便了。万一我被忽视了。我看到了一些不同的帖子here和{a2}。然而,在我的情况下,我不能让他们工作。在

我想要的是下面确定的前三种情况匹配,最后一种类型被忽略,允许我提取第1项和第3项。在

some text/more text
(formula)/dividethis
divideme/(byme)
"dont match/me"

Tags: 实例字符串text表达式情况some字符单词
2条回答

这将只匹配不在引号内的单词。在

import re

text = """
some text/more text "dont match/me" divideme/(byme)
(formula)/dividethis
divideme/(byme) "dont match/me hel d/b lo a/b" divideme/(byme)
"dont match/me"
"""

groups=re.findall("(?:\".*?\")|(\S+/\S+)", text, flags=re.MULTILINE)
print filter(None,groups)

输出:

^{pr2}$
  • (?:\".*?\“)这将匹配引号内的所有内容,但不会捕获此组。在
  • (\S+/\S+)这将只匹配引号之外的单词/单词,并将捕获此组。在

Demo on Regex101

虽然不漂亮,但这会让你随心所欲:

(?<!")(?:\(|\b)[^"\n]+\/[^"\n]+(?:\)|\b)(?!")

Demo on Regex101

让我们把它分解一下:

  • ^{s}前面有一个开方括号}或者不匹配一个开方括号。它通过使用negative lookbehind来实现这一点。在
  • [^"\n]+将匹配一个或多个字符,只要它们不是引号或换行符(\n)。在
  • \/将匹配文本斜杠字符。在
  • 最后,(?:\)|\b)(?!")将匹配右括号或单词边界,只要它后面没有引号。它通过使用negative lookahead来实现这一点。请注意,(?:\)|\b)只能按此顺序100%正确工作-如果您反转它们,它将删除括号中的匹配项,因为它在到达括号之前遇到了一个单词边界。在

相关问题 更多 >