簡體   English   中英

正則表達式災難性的回溯; 提取單詞以大寫字母開頭,然后是特定單詞

[英]regex catastrophic backtracking ; extracting words starts with capital before the specific word

我是Python世界的新手,正則表達式遇到了麻煩。

我正在嘗試在“ sale(s)”(或“ sale(s)”)一詞前提取公司的名稱。

我發現我的文本數據中的公司名稱都以大寫字母開頭(其他部分可以是小寫或大寫字母或數字或“-”或“,例如,“ Abc Def”或“ ABC DEF”或僅是“ ABC”或“ Abc”),

其中一些采用的格式如(“ Abc Def”或“ Abc Def”)。

例如,

從文本中

主要客戶在2005財年,公司持續經營中與Kmart Corporation的直接交易產生了約21%的合並收入(4,782,852美元)。 電腦產品的銷售良好。 但是,計算機零件和顯示分部的銷售一直在下降。

我只想提取“計算機的零件和顯示段”。

所以我試圖創建一個正則表達式

((?:(?:[A-Z]+[a-zA-Z\-0-9\']*\.?\s?(?:and |\& )?)+)+?(?:[S|s]ales?\s))

(1. [AZ] + [a-zA-Z-0-9 \\'] *。?\\ s =>此部分用於查找以大寫字母開頭的單詞,而其他部分則由az或AZ或0-9組成或-或'或。

  1. (?:和| \\&)? =>這部分是將單詞與和或&匹配)

但是,在https://regex101.com/上,它指出了災難性的回溯,我閱讀了一些相關文章,但仍然找不到解決此問題的方法。

你可以幫幫我嗎?

謝謝!

總覽

指出您的模式中的一些事項:

  • [a-zA-Z\\-0-9\\']您無需在此處轉義' 另外,您只需放置-在集合的開頭或結尾,就不必對其進行轉義。
  • \\&不需要轉義&字符。
  • [S|s]說匹配S| |或s ,因此您可能會匹配|ales 正確的寫法是[Ss]

查看正則表達式在這里使用

(?:(?:[A-Z][\w'-]*|and) +)+(?=[sS]ales?)

結果

輸入項

主要客戶在2005財年,公司持續經營中與Kmart Corporation的直接交易產生了約21%的合並收入(4,782,852美元)。 電腦產品的銷售良好。 但是,計算機零件和顯示分部的銷售一直在下降。

產量

Computer's Parts and Display Segment 

說明

  • (?:(?:[AZ][\\w'-]*|and) +)+匹配一次或多次
    • (?:[AZ][\\w'-]*|and)匹配以下任一
      • [AZ][\\w'-]*匹配任何大寫ASCII字符,后跟任意數量的單詞字符,撇號'或連字符-
      • and從字面上匹配
    • +匹配一個或多個空格
  • (?=[sS]ales?)正前瞻確保任何話的saleSalesales ,或Sales如下

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM