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

正则表达式忽略引号中的模式(Python或R),python,r,regex,Python,R,Regex,我正在尝试创建一个正则表达式,它允许我查找字符串实例,其中有一个未标记的/ 例如: 我想出了下面的表达式,它允许我在/之前查找单词字符或右括号,然后查找单词字符或开括号字符 (\w|\))/(\(|\w) 这在大多数情况下都非常有效,但是当我有一个/括在引号中时,我就要崩溃了。在这种情况下,我希望它被忽略。我看过一些不同的帖子和文章。然而,在我的情况下,我无法让它们发挥作用 我想要的是匹配下面确定的前三个案例,忽略最后一个cast,以便提取项目1和项目3 some text/more text

我正在尝试创建一个正则表达式,它允许我查找字符串实例,其中有一个未标记的
/
例如:

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

(\w|\))/(\(|\w)
这在大多数情况下都非常有效,但是当我有一个
/
括在引号中时,我就要崩溃了。在这种情况下,我希望它被忽略。我看过一些不同的帖子和文章。然而,在我的情况下,我无法让它们发挥作用

我想要的是匹配下面确定的前三个案例,忽略最后一个cast,以便提取项目1和项目3

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

这并不漂亮,但这会满足你的要求:

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

让我们把它分解一下:

  • (?将匹配一个或多个字符,只要它们不是引号或换行符(
    \n
  • \/
    将匹配文本斜杠字符
  • 最后,
    (?:\)\b)(?!”
    将匹配结束括号或单词边界,只要后面没有引号。它通过使用。注意,
    (?:\)\b)
    按此顺序只能100%正确工作-如果您将其反转,它将在括号中删除匹配项,因为它在到达括号之前遇到单词边界

这并不漂亮,但它可以满足您的需求:

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

让我们把它分解一下:

  • (?将匹配一个或多个字符,只要它们不是引号或换行符(
    \n
  • \/
    将匹配文本斜杠字符
  • 最后,
    (?:\)\b)(?!”
    将匹配一个结束括号或一个单词边界,只要它后面没有引号。它通过使用一个。注意,
    (?:\)\b)
    按此顺序只能100%正确地工作-如果你颠倒它们,它将在括号上删除匹配项,因为它在到达括号之前遇到了单词边界

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

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)
输出:

['text/more', 'divideme/(byme)', '(formula)/dividethis', 'divideme/(byme)', 'divideme/(byme)']
  • (?:\“*?\”)这将匹配引号内的所有内容,但不会捕获此组
  • (\S+/\S+)这将仅匹配引用之外的单词/单词,并且将捕获此组

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

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)
输出:

['text/more', 'divideme/(byme)', '(formula)/dividethis', 'divideme/(byme)', 'divideme/(byme)']
  • (?:\“*?\”)这将匹配引号内的所有内容,但不会捕获此组
  • (\S+/\S+)这将仅匹配引用之外的单词/单词,并且将捕获此组

match/me“但不是/me”这样的字符串会发生什么事?
我的期望是第一个实例会匹配,但不是第二个。像
match/me”但不是/me”这样的字符串会发生什么事?
我的期望是第一个实例会匹配,但不是第二个。这很好,肯定会识别完整的字符串,有没有可能将第一部分(即
/
之前)和第二部分(即
/
之后)分开?实际计算出
(?这是基于
python
的转义方法,而不是
PHP
,这很好,肯定能识别完整的字符串,有可能分开第一部分吗(即在
/
之前)和第二部分(即
/
之后)实际解决了
(?这是基于
python
的转义方法,而不是
PHP