【问题标题】:Regex to ignore pattern found in quotes (Python or R)正则表达式忽略引号中的模式(Python 或 R)
【发布时间】:2017-03-27 15:56:25
【问题描述】:

我正在尝试创建一个正则表达式,它允许我找到一个字符串的实例,其中我有一个不带空格的/ 例如:

some characters/morecharacters

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

(\w|\))/(\(|\w)

这适用于大多数情况,但是当我将 / 括在引号中时,我就会陷入困境。在这种情况下,我希望它被忽略。我看过一些不同的帖子herehere。但是,我不能让它们在我的情况下工作。

我希望下面确定的前三个案例匹配,最后一个演员被忽略,让我提取项目 1 和项目 3。

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

【问题讨论】:

  • match/me "but not/me" 这样的字符串会发生什么?
  • 我的期望是第一个实例会匹配,但不是第二个。

标签: python r regex


【解决方案1】:

它不是很漂亮,但这会做你想做的:

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

Demo on Regex101

让我们分解一下:

  • (?&lt;!")(?:\(|\b) 将匹配左括号或单词边界,只要它前面没有引号。它通过使用negative lookbehind 来做到这一点。
  • [^"\n]+ 将匹配一个或多个字符,只要它们既不是引号也不是换行符 (\n)。
  • \/ 将匹配文字斜线字符。
  • 最后,(?:\)|\b)(?!") 将匹配右括号或单词边界,只要它后面没有引号。它通过使用negative lookahead 来做到这一点。请注意,(?:\)|\b) 在此顺序中只能 100% 正确工作 - 如果您反转它们,它将放弃括号中的匹配项,因为它在到达括号之前遇到了单词边界。

【讨论】:

  • 太好了,当然可以识别完整的字符串,是否可以拆分第一部分(即/之前)和第二部分(即/之后)?
  • 其实想通了((?&lt;!\")(?:\(|\b)[^\"\n]+)/([^\"\n]+(?:\)|\b)(?!\"))这是基于python的转义方式而不是PHP
【解决方案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)

输出:

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

Demo on Regex101

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多