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

Cod*_*117 3 python regex string io set

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

# Text file
bill
beep-boop
wow
apostrophe'
Run Code Online (Sandbox Code Playgroud)

然后当我打印

>>> print(mySet)
{'bill', 'beep', 'boop', 'wow', 'apostrophe'}
Run Code Online (Sandbox Code Playgroud)

所以我也不想要任何前导或结尾的撇号,但是如何在split()函数中使用多个分隔符呢?我只有这个:

mySet = set((stdin.read().split()))
Run Code Online (Sandbox Code Playgroud)

Bra*_*mon 5

您可以专注于构成单词/标记的内容,而不是专注于分隔符.从你的评论,

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

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

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

这是一个标记化器,它封装了:

import re

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

示例文本文件:

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
Run Code Online (Sandbox Code Playgroud)

可以理解为:

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'}
Run Code Online (Sandbox Code Playgroud)

这类似于一些机器学习算法用于将文本文档转换为令牌计数矩阵的正则表达式.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)
Run Code Online (Sandbox Code Playgroud)

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

 $ python3 tokenizer.py textfile.txt
Run Code Online (Sandbox Code Playgroud)

你可以在这里试验一下.