簡體   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