繁体   English   中英

如何捕捉前瞻性的后瞻性正则表达式python

[英]How to capture both lookahead lookbehind regex python

这是一个字符串:

str = "Academy \nADDITIONAL\nAwards and Recognition: Greek Man of the Year 2011 Stanford PanHellenic Community, American Delegate 2010 Global\nEngagement Summit, Honorary Speaker 2010 SELA Convention, Semi-Finalist 2010 Strauss Foundation Scholarship Program\nComputer Skills: Competency: MATLAB, MySQL/PHP, JavaScript, Objective-C, Git Proficiency: Adobe Creative Suite, Excel\n(highly advanced), PowerPoint, HTML5/CSS3\nLanguages: Fluent English, Advanced Spanish\n\x0c"

我想从“ADDTIONAL”捕获到“语言”,所以我写了这个正则表达式:

regex = r'(?<=\n(ADDITIONAL|Additional)\n)[\s\S]+?(?=\n(Languages|LANGUAGES)\n*)'

然而它只能捕捉到它们之间的所有东西([\\s\\S]+) 它不会捕获ADDTIONALLanguages 我在这里错过了什么?

你的正则表达式是

regex = r'(?<=\n(ADDITIONAL|Additional)\n)[\s\S]+?(?=\n(Languages|LANGUAGES)\n*)'

你的字符串是

Academy \nADDITIONAL\nAwards and Recognition: ... \nLanguages:
                     ^^                          ^^
                     ||                          ||
Match Position:-(?<=\n(ADDITIONAL|Additional)\n)(?=\n(Languages|LANGUAGES)\n*)

那么[\\s\\S]+? 将包含这两个位置之间的内容,不包括ADDITIONALLANGUAGES

你只需要找到ADDITIONAL的起始位置和LANGUAGES结束位置。 这可以使用以下正则表达式完成

(?=\n(ADDITIONAL|Additional)\n)([\s\S]+?)(?<=\n(Languages|LANGUAGES)\b)

此外,如果你想要[\\s\\S]+? 只捕获所有内容,然后您可以使用非捕获组来AdditionalLanguages

(?=\n(?:ADDITIONAL|Additional)\n)[\s\S]+?(?<=\n(?:Languages|LANGUAGES)\b)

Academy \nADDITIONAL\nAwards and Recognition: ... \nLanguages:
        ^^                                                  ^^
        ||                                                  ||
(?=\n(ADDITIONAL|Additional)\n)             (?<=\n(Languages|LANGUAGES))

Python代码

p = re.compile(r'(?=\n(?:ADDITIONAL|Additional)\n)[\s\S]+?(?<=\n(?:Languages|LANGUAGES)\b)', re.MULTILINE)
test_str = "Academy \nADDITIONAL\nAwards and Recognition: Greek Man of the Year 2011 Stanford PanHellenic Community, American Delegate 2010 Global\nEngagement Summit, Honorary Speaker 2010 SELA Convention, Semi-Finalist 2010 Strauss Foundation Scholarship Program\nComputer Skills: Competency: MATLAB, MySQL/PHP, JavaScript, Objective-C, Git Proficiency: Adobe Creative Suite, Excel\n(highly advanced), PowerPoint, HTML5/CSS3\nLanguages: Fluent English, Advanced Spanish\n\x0c"
print(re.findall(p, test_str))

Ideone演示

它被捕获但它不是捕获组0的一部分,因为组0
仅包含消耗的匹配,即移动当前的匹配
位置。

断言不会移动位置,所以如果你捕获一个断言
它不会成为比赛的一部分。

但是,如果断言之后是一些消耗的子表达式
在断言中引用的那些,它将成为整体匹配的一部分。

您当前的正则表达式与您的字符串不匹配。 匹配你拥有的字符串
删除换行符\\n引用。

 (?<=
      ( ADDITIONAL | Additional )   # (1)
 )
 [\s\S]+? 
 (?=
      ( Languages | LANGUAGES )     # (2)
 )

如果你想在匹配中包含它们,不要把它们放在外观中,因为它们的目的是测试周围的文本而不在匹配结果中包含它。 如果您只是需要更换,请使用普通的非捕获组。

regex = r'\n(?:ADDITIONAL|Additional)\n[\s\S]+?\n(?:Languages|LANGUAGES)\n*'

顺便说一句,你的正则表达式需要在ADDITIONALLanguages周围换行,但你的字符串中没有任何换行符。

试试这个

(?<=ADDITIONAL\s).*?(?=\sLanguages)

正则表达式演示

说明:
(?<=…) :正面的后视样本
\\s :“空白字符”:空格,制表符,换行符,回车符,垂直制表符样本
. :除了换行符的任何字符样本
*样品零次或多次
? :一次或不一次样品
(?=…) :前瞻性样本

蟒蛇:

import re
p = re.compile(ur'(?<=ADDITIONAL\s).*?(?=\sLanguages)', re.IGNORECASE)
test_str = u"the companys direction ADDITIONAL Awards: 2010 Global Engagement Summit, Languages: Fluent Japanese"

g = re.findall(p, test_str)
print g //[u'Awards: 2010 Global Engagement Summit,']

如果您需要捕获包含ADDITIONALLANGUAGES ,请使用这样的简单正则表达式。

\b(ADDITIONAL .* Languages)\b

在解决方案中使用时,请确保包含re.IGNORECASE标志。

请参阅REGEX101上的演示

我想你很容易让事情复杂化,即:

match = re.search("(ADDITIONAL.*?Languages)", subject, re.MULTILINE)

正则表达式解释:

(ADDITIONAL.*?Languages)


Match the regex below and capture its match into backreference number 1 «(ADDITIONAL.*?Languages)»
   Match the character string “ADDITIONAL” literally (case sensitive) «ADDITIONAL»
   Match any single character that is NOT a line break character (line feed) «.*?»
      Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
   Match the character string “Languages” literally (case sensitive) «Languages»

Regex101演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM