为什么匹配结果在例如r'\ b(?:( can)|(could))\ b'和r'(\ bcan \ b)|(\ bcould \ b)'之间有所不同?

时间:2019-06-22 04:46:22

标签: python regex

r'\b(?:(can)|(could))\b'r'(\bcan\b)|(\bcould\b)'快得多。这是有道理的,因为第一个模式从字边界开始看并且效率更高。让我感到困惑的是,这两种模式对于我的关键字列表和文档,在re.findall中产生的结果略有不同。更改代码可使匹配更快,但是我无法复制以前的结果。

除了效率方面的差异外,这两种模式似乎与我等效。我想念什么吗?

我的模式如下,可以找到HERE输入内容太大而无法发布。它们是包含成千上万个单词的txt文件。

\b(?:(Anti-takeover (?:provisions|provision))|(Bank debt[s]?)|(Capital 
(?:expenditure|expenditures))|(Capital (?:lease|leases))|(Chapter 11)| 
(Chapter 7)|(Chapter 9)|(Collateral[s]?)|(Concentrated ownership[s]?)| 
(Covenant|covenants)|(Credit (?:facility|facilities))|(Credit rating[s]?)| 
(Credit risk[s]?)|(Debt burden[s]?)|(Decline in stock price[s]?)| 
(Default[s]?|defaulted)|(Defined Benefit[s]?)|(Dilution[s]?)|(Dividend[s]?)| 
(Downgrade[s]?)|(Family)|(Financial condition[s]?)|(Financing cost[s]?)| 
(Funded status)|(Illiquid market[s]?)|(Improvements)|(Indebtedness)|(Insider 
sales)|(Investment[s]? in equipment)|(Investment[s]? in plant[s]?)|(Lease 
(?:commitment|commitments))|(lease|leases|leasing)|(Leverage[s]?)| 
(Leveraged (?:lease|leases))|(Limited trading)|(Liquidity|Liquidities)| 
(Loan[s]?)|(Locked-in (?:lease|leases))|(Mandatory contribution[s]?)| 
(Maturity|maturities)|(Negative operating cash flow[s]?)|(New financing)|(? 
-i:O.P.E.B.)|(Obligations)|(?-i:OPEB)|(Operating losses)|(Penny stock[s]?)| 
(Postretirement[s]?)|(Rating[s]?)|(Refinance)|(Refinancing)|(Reinsurance)| 
(Renegotiation[s]?)|(Reorganization[s]?)|(Reserves)|(Revolver[s]?)|(Sale 
of productive assets)|(Stock market listing)|(Stock price 
(?:volatility|volatilities))|(Stock price drop[s]?)|(Underfunded 
 pensions)|(Underwriting)|(Volatility of operating results)|(Volatility of 
 revenues)|(Volatility of sales)|(Working capital[s]?))\b

我知道正则表达式并不优雅。它是从关键字列表生成的。一些关键字采用诸如“ provisions”之类的混合形式。 “规定?”还是仅仅是“规定”?会更好。我做了一些更改,但不是全部。 最初是由

生成的
re_fin = '|'.join(r'((?-i:\b{}\b))'.format(k) if k.upper() == k else 
        r'(\b{}\b)'.format(k) for k in keywords])

我发现它非常慢,并将其更改为以下内容(以显示所有步骤):

  patterns = [r"(?-i:{})".format(k) if k.upper() == k else r"({})".format(k) 
            for k in keywords]
  patterns = "|".join(patterns)
  patterns = r"\b(?:{})\b".format(patterns)

1 个答案:

答案 0 :(得分:0)

我发现这是由于分组问题。

模式= [r“(?-i:{})”。format(k),如果k.upper()== k否则r“({})”。format(k)             对于关键字中的k]

all-CAP关键字未分组,因此未被re.findall捕获。 (?-i:{})应该是(?-i:({}))