Skip to main content
 首页 » 编程设计

Python 正则表达式保留更多标记

2024年08月25日30myhome

我在 Python 中使用以下正则表达式来保留不包含非字母字符的单词:

(?<!\S)[A-Za-z]+(?!\S)|(?<!\S)[A-Za-z]+(?=:(?!\S)) 

问题是这个正则表达式没有保留我想保留的单词,例如:

Company, 
months. 
third-party 

换句话说,我想保留后跟逗号、点或两个单词之间有破折号的单词。

关于如何实现这个的任何想法?

我尝试添加类似 |(?<!\S)[A-Za-z]+(?=\.(?!\S)) 的内容对于点,但它似乎没有用。

谢谢!

编辑:

应该匹配这些:

On-line 
.   These 
maintenance, 
other. 
.  Our 
Google 

不应匹配这些:

MFgwCgYEVQgBAQICAf8DSgAwRwJAW2sNKK9AVtBzYZmr6aGjlWyK3XmZv3dTINen 
NY7xtb92dCTfvEjdmkDrUw== 
$As_Of_12_31_20104206http://www.sec.gov/CIK0001393311instant2010-12-31T00:00:000001-01-01T00:00:00falsefalseArlington/S.Cooper 
-Publisher 
gaap_RealEstateAndAccumulatedDepreciationCostsCapitalizedSubsequentToAcquisitionCarryingCostsus 

目前我正在使用以下 python 代码逐行读取文本文件:

find_words = re.compile(r'(?<!\S)[A-Za-z]+(?!\S)|(?<!\S)[A-Za-z]+(?=:(?!\S))').findall  

然后我打开文本文件

contents = open("test.txt","r")  

然后我在内容中逐行搜索单词:

if find_words(line.lower()) != []: lineWords=find_words(line.lower())  
print "The words in this line are: ", lineWords  

按以下方式使用一些单词列表:

wanted1 = set(find_words(open('word_list_1.csv').read().lower())) 
wanted2 = set(find_words(open('word_list_2.csv').read().lower())) 
negators = set(find_words(open('word_list_3.csv').read().lower())) 

我首先要从.txt 文件中获取有效的单词,然后检查这些单词是否属于单词列表。这两个步骤是独立的。

请您参考如下方法:

我建议这个正则表达式:

find_words = re.compile(r'(?:(?<=[^\w./-])|(?<=^))[A-Za-z]+(?:-[A-Za-z]+)*(?=\W|$)').findall 

我更改了您最初的正则表达式中的 3 个部分:

中间部分:

[A-Za-z]+(?:-[A-Za-z]+)* 

这允许连字符。

最后一部分:

(?=\W|$) 

这与 (?!\S) 有点相似,只是它也允许像标点符号这样的非空格字符。所以会发生什么,如果在单词匹配之后,行结束,或者有一个非单词字符,换句话说,没有字母或数字或下划线(如果你不想要 word_要匹配 word ,那么您必须将 \W 更改为 [a-zA-Z0-9] )。

第一部分(可能是最复杂的部分):

(?:(?<=[^\w./-])|(?<=^)) 

它由两部分组成,匹配 (?<=[^\w./-]) 或 (?<=^) 。如果该行在要匹配的单词之前开始,则第二个允许匹配。我们不能使用 (?<=[^\w./-]|^),因为 re 的 python 后视不能具有可变宽度([^\w./-] 的长度为 1,^ 的长度为 0)。

(?<=[^\w./-]) 允许在单词之前没有单词字符、句点、正斜杠或连字符的情况下进行匹配。

分解后,我认为这些小部分相当简单,但如果您有任何需要更详细说明的内容,我可以提供更多细节。