如何按空格分割字符串并将特殊字符视为Python中的单独单词?

时间:2016-05-25 18:44:35

标签: python python-2.7

假设我有一个字符串,

"I want that one, it is great."

我想将此字符串拆分为

["I", "want", "that", "one", ",", "it", "is", "great", "."]

",.:;"等特殊字符以及可能的其他字符视为单独的字词。

使用Python 2.7有没有简单的方法呢?

更新

对于"I don't."等示例,它应为["I", "don", "'", "t", "."]。理想情况下,它可以与非英语标点符号一起使用,例如؛和其他标点符号。

4 个答案:

答案 0 :(得分:1)

有关类似问题,请参阅here。答案也适用于你:

import re
print re.split('(\W)', "I want that one, it is great.")
print re.split('(\W)', "I don't.")

您可以使用过滤器删除re.split返回的空格和空字符串:

s = "I want that one, it is great."
print filter(lambda _: _ not in [' ', ''], re.split('(\W)', s))

答案 1 :(得分:1)

您可以使用Regex和简单的列表解析来执行此操作。正则表达式将拉出单词并分隔标点符号,列表理解将删除空格。

import re
s = "I want that one, it is great. Don't do it."
new_s = [c.strip() for c in re.split('(\W+)', s) if c.strip() != '']
print new_s

new_s的输出将为:

['I', 'want', 'that', 'one', ',', 'it', 'is', 'great', '.', 'Don', "'", 't', 'do', 'it', '.']

答案 2 :(得分:1)

In [70]: re.findall(r"[^,.:;' ]+|[,.:;']", "I want that one, it is great.")
Out[70]: ['I', 'want', 'that', 'one', ',', 'it', 'is', 'great', '.']

In [76]: re.findall(r"[^,.:;' ]+|[,.:;']", "I don't.")
Out[76]: ['I', 'don', "'", 't', '.']

正则表达式[^,.:;' ]+|[,.:;']匹配(除,.:;'之外的1个或多个字符或文字空间),或(文字字符,.:;')。

或者,使用regex module,您可以使用[:punct:]字符类轻松扩展此内容以包含所有punctuation and symbols

In [77]: import regex

在Python2中:

In [4]: regex.findall(ur"[^[:punct:] ]+|[[:punct:]]", u"""A \N{ARABIC SEMICOLON} B""")
Out[4]: [u'A', u'\u061b', u'B']

In [6]: regex.findall(ur"[^[:punct:] ]+|[[:punct:]]", u"""He said, "I don't!" """)
Out[6]: [u'He', u'said', u',', u'"', u'I', u'don', u"'", u't', u'!', u'"']

在Python3中:

In [105]: regex.findall(r"[^[:punct:] ]+|[[:punct:]]", """A \N{ARABIC SEMICOLON} B""")
Out[105]: ['A', '؛', 'B']

In [83]: regex.findall(r"[^[:punct:] ]+|[[:punct:]]", """He said, "I don't!" """)
Out[83]: ['He', 'said', ',', '"', 'I', 'don', "'", 't', '!', '"']

请注意,如果您希望unicode匹配unicode标点符号或符号,请将regex.findall作为第二个参数传递给[:punct:]

在Python2中:

import regex
print(regex.findall(r"[^[:punct:] ]+|[[:punct:]]", 'help؛'))
print(regex.findall(ur"[^[:punct:] ]+|[[:punct:]]", u'help؛'))

打印

['help\xd8\x9b']
[u'help', u'\u061b']

答案 3 :(得分:0)

我不知道任何可以执行此操作的函数,但您可以使用for循环。

这样的事情:     word =“”     wordLength = 0     对于范围内的i(0,len(stringName)):       if stringName [i]!=“”:           for x in range((i-wordLength),i):                word + = stringName [i]                wordLength = 0           list.append(字)           word =“”       其他:           worldLength =字长+ 1 希望这有效...对不起,如果这不是最好的方式