如何将带分隔符的字符串拆分成一个集合?

时间:2018-02-13 04:01:05

标签: python regex string io set

我想将文件中的单词读成这样的集合:

# Text file
bill
beep-boop
wow
apostrophe'

然后当我打印

>>> print(mySet)
{'bill', 'beep', 'boop', 'wow', 'apostrophe'}

所以我也不想要任何前导或结尾的撇号,但我怎样才能有split()函数的多个分隔符?我只有这个:

mySet = set((stdin.read().split()))

1 个答案:

答案 0 :(得分:5)

您可以专注于构成单词/标记的内容,而不是专注于分隔符。根据您的意见,

  
      
  • 单词是一个或多个不区分大小写的字符。字符可以是英语的所有字母和/或单引号/撇号。没有小数位数。没有前导或结尾的撇号。

  •   
  • 'Some99'不会被视为单词,不应该被放入集合中。 “w3rd”也是如此。

  •   
  • 如果有两个单词'他'& '他' - 我只想要小写版本。

  •   

这是一个封装了以下内容的标记器:

import re

regex = re.compile(r'\b[A-Za-z\'"]+\b', flags=re.U)

示例文本文件:

bill
beep-boop
wow
apostrophe'
a
bb
a?c?d?
abcd-abcd?
J'aime
I'm
He said, "Yep"
Some99\words\here\\
One more w3rd

可以理解为:

with open('textfile.txt', 'r') as f:
    text = set(word.lower() for word in regex.findall(f.read()))

text
# {'d', 'a', 'said', 'abcd', 'apostrophe', 'beep', 'bb', 'c', 'more', 'he', 'words', "i'm", 'yep', 'bill', "j'aime", 'one', 'wow', 'here', 'boop'}

这类似于某些机器学习算法用于将文本文档转换为令牌计数矩阵的正则表达式。 scikit-learn的CountVectorizer使用token_pattern='(?u)\b\w\w+\b',它将单词定义为包含两个或更多字母。

要从命令行运行此命令,请创建一个名为tokenizer.py的脚本:

# tokenizer.py

import re
import sys

regex = re.compile(r'\b[A-Za-z\'"]+\b', flags=re.U)


if __name__ == '__main__':
    file = sys.argv[1]
    with open(file, 'r') as f:
        text = set([word.lower() for word in regex.findall(f.read())])
    print(text)

然后你可以从命令行运行它,如下所示:

 $ python3 tokenizer.py textfile.txt

您可以试用此here