Python 什么';使用空格或标点符号作为分隔符,将unicode字符串拆分为列表的快速方法是什么?
印刷品Python 什么';使用空格或标点符号作为分隔符,将unicode字符串拆分为列表的快速方法是什么?,python,regex,Python,Regex,印刷品 # -*- coding: utf-8 -*- import string s = u"Dobre uczynki są jak dobre poematy. Można łatwo uchwycić, ku czemu zmierzają, lecz nie zawsze da się je racjonalnie wytłumaczyć." exclude = set(string.punctuation) s = ''.join(ch for ch in s if ch
# -*- coding: utf-8 -*-
import string
s = u"Dobre uczynki są jak dobre poematy. Można łatwo uchwycić, ku czemu zmierzają, lecz nie zawsze da się je racjonalnie wytłumaczyć."
exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)
s = s.split()
print s
它似乎不仅不雅,而且慢
你能找到更好的解决办法吗?也许使用正则表达式?使用
当然,您可以使用更具体的正则表达式,但这一个似乎符合要求
请注意,flags
参数适用于python 2.7+。如果您使用的是早期版本,只需使用'\W+(?u)
作为正则表达式。这样就可以了。(我承认我还没有测试过它)
编辑:不要用我的。马哈茂德·阿卜杜勒卡德(Mahmoud Abdelkader)的上述答案更好。如果需要重复使用正则表达式并使用
我会使用nltk,原因如下:
import string
import re
s = u"Dobre uczynki są jak dobre poematy. Można łatwo uchwycić, ku czemu zmierzają, lecz nie zawsze da się je racjonalnie wytłumaczyć."
regex = re.compile(r'[%s\s]+' % re.escape(string.punctuation))
print regex.split(s)
Regex:22.7673070431 nltk:16.1646370888的可能重复项,或者他/她可以使用re.compile()编译正则表达式,并让它接受flags参数。很好地抓住了“\W+”!向上投票作为我的解决方案,虽然更紧凑,但不考虑其中包含数字的字符串。@zarkdav:您的解决方案正确地拆分了“Mary had 1 lamb”或“我在EuroScipy2010”,因此我向上投票了您的解决方案。:)我测试了,但我没有回答。。。!
# -*- coding: utf-8 -*-
import re
s = u"Dobre uczynki są jak dobre poematy. Można łatwo uchwycić, ku czemu zmierzają, lecz nie zawsze da się je racjonalnie wytłumaczyć."
print re.split('\W+', s, flags=re.UNICODE)
import re, string
s = 'your string ...'
re.split('\s'+''.join(string.punctuation), s)
import string
import re
s = u"Dobre uczynki są jak dobre poematy. Można łatwo uchwycić, ku czemu zmierzają, lecz nie zawsze da się je racjonalnie wytłumaczyć."
regex = re.compile(r'[%s\s]+' % re.escape(string.punctuation))
print regex.split(s)
# coding: utf-8
from time import time
import nltk
import string
import re
def bench(n,s):
start_1 = time()
regex = regex = re.compile(r'[%s\s]+' % re.escape(string.punctuation))
for i in xrange(n):
regex.split(s)
stop_1 = time()
start_2 = time()
for i in xrange(n):
nltk.wordpunct_tokenize(s)
stop_2=time()
print "Regex: {} nltk:{}".format((stop_1-start_1),(stop_2-start_2))
bench(1000000, u"Dobre uczynki są jak dobre poematy. Można łatwo uchwycić, ku czemu zmierzają, lecz nie zawsze da się je racjonalnie wytłumaczyć.")