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)
答案 0 :(得分:0)
我发现这是由于分组问题。
模式= [r“(?-i:{})”。format(k),如果k.upper()== k否则r“({})”。format(k) 对于关键字中的k]
all-CAP关键字未分组,因此未被re.findall捕获。 (?-i:{})应该是(?-i:({}))