我在 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./-]) 允许在单词之前没有单词字符、句点、正斜杠或连字符的情况下进行匹配。
分解后,我认为这些小部分相当简单,但如果您有任何需要更详细说明的内容,我可以提供更多细节。
