【问题标题】:Regex Negative Lookbehind ignoredRegex Negative Lookbehind 被忽略
【发布时间】:2020-12-31 19:38:36
【问题描述】:

这是我的正则表达式:

(?<!PAYROLL)(FIDELITY(?!.*TITLE)(?!.*NATION)|INVEST)(?!.*PAYROLL)

这是我的文字

INCOMING WIRE TRUST GS INVESTMENT 
VANGUARD PAYROLL
PAYROLL FIDELITY
ACH CREDIT FIDELITY INVESTM-FIDELITY
ACH CREDIT FIDELITY INVESTM-FIDELITY
ACH DEBIT FIDELITY 
ACH DEBIT FIDELITY 
ACH CREDIT FIDELITY INVESTM-FIDELITY

http://regexr.com 上运行此程序时(使用 PCRE RegEx 引擎),它在"PAYROLL FIDELITY" 上匹配,但我指定了一个否定的后视而不这样做(?&lt;!PAYROLL)

任何帮助表示赞赏。

【问题讨论】:

  • 但是有空格,试试(?&lt;!PAYROLL\s),见regex101.com/r/MclkGz/1
  • 改用regex101 - 正则表达式似乎在那里工作
  • 那行得通,@WiktorStribiżew,为什么我不能使用.* 而不是\s
  • 不可能在 PCRE 正则表达式模式的后视中使用无限宽度模式。您可以使用(*SKIP)(*F):\bPAYROLL.*?FIDELITY(*SKIP)(*F)|(FIDELITY(?!.*TITLE)(?!.*NATION)|INVEST)(?!.*PAYROLL) 解决它。见regex101.com/r/MclkGz/2
  • ah * 后视内的量词使其宽度不固定,我看看能不能找到解决办法

标签: python regex regex-lookarounds regex-negation


【解决方案1】:

(?&lt;!PAYROLL) 否定后向匹配与PAYROLL 字符序列之前没有立即匹配的位置。在PAYROLL FIDELITY 字符串中,FIDELITY 前面不是紧跟PAYROLL,而是紧跟在PAYROLL + 空格前面。

您可以通过多种方式解决当前问题。如果您确定字符串中的单词之间总是有一个空格(例如,它是一个标记化的字符串),请在PAYROLL 之后添加\s(?&lt;!PAYROLL\s)

如果可以有一个或多个空格,则 (?&lt;!PAYROLL\s+) 模式在 PCRE 中将无法作为 PCRE 后向模式 must be of fixed width 工作。您可能会匹配(某些)异常并使用(*SKIP)(*FAIL) PCRE 动词跳过它们:

PAYROLL\s+FIDELITY(*SKIP)(*F)|(FIDELITY(?!.*TITLE)(?!.*NATION)|INVEST)(?!.*PAYROLL)

请参阅regex demo。您甚至可以将PAYROLL\s+FIDELITY(*SKIP)(*F) 替换为PAYROLL.*?FIDELITY(*SKIP)(*F)PAYROLL[\s\S]+?FIDELITY(*SKIP)(*F) 以跳过从PAYROLL 到最左边的FIDELITY 的任何文本块。 PAYROLL\s+FIDELITY(*SKIP)(*F)匹配PAYROLL,一个或多个空格,FIDELITY然后匹配失败触发回溯,然后跳过匹配,从发生失败的索引开始搜索下一个匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多