Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将带分隔符的字符串拆分为一个集合?_Python_Regex_String_Io_Set - Fatal编程技术网

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

Python 如何将带分隔符的字符串拆分为一个集合?,python,regex,string,io,set,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())) 您可以将重点放在单词/标记的构成上

我想将文件中的单词读入如下集合:

# Text file
bill
beep-boop
wow
apostrophe'
然后当我打印的时候

>>> print(mySet)
{'bill', 'beep', 'boop', 'wow', 'apostrophe'}
所以我也不想要任何前导或结尾的撇号,但是如何使用
split()
函数来设置多个分隔符呢?我所拥有的只是:

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

您可以将重点放在单词/标记的构成上,而不是放在分隔符上。从你的评论来看

  • 单词是一个或多个不区分大小写的字符。字符可以是英语中的所有字母,也可以是单个引号/撇号。没有十进制数字。没有开头或结尾的撇号

  • “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使用了
token\u 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

你可以尝试一下。

你到底有什么分隔符?@A单词是一个或多个不区分大小写的字符。字符可以是英语中的所有字母,也可以是单个引号/撇号。没有十进制数字。没有前导或结尾撇号你的正则表达式与“J'aime”和“I'm”不匹配。对不起,实际上这些应该是一个单词。例如,在
中,撇号属于
项下,字符可以是所有英文字母和/或撇号。
只应删除开头和结尾的撇号。所以它应该在列表中:
{'Some','Other','Words','Don'}
是的,如果文本文件中有两个单词:
He
&
He
我只想要小写版本@BradSolomon P.S.感谢大家的帮助:)@BradSolomon
Some99
不会被认为是一个词,不应该放在mySet中。w3rd的情况也是如此,这是我最后一次更新。如果需要的话,你可以自己做一些研究。祝你好运