Python如何将字符串拆分为包含带单引号的单词的单词?

时间:2014-10-06 03:05:45

标签: python regex string split

我有一个字符串a,我想返回一个列表b,其中包含的字词不是从@#开始的,而是包含任何非单词字符。

然而,我很难将“他们”这样的词语作为单词保留。请注意,“Okay .... so”这样的词应该分成两个词“okay”和“so”。

我认为问题可以通过修改正则表达式来解决。谢谢!

a = "@luke5sos are you awake now?!!! me #hashtag time! is@ over, now okay....so they're rich....and hopefully available?"
a = a.split()
b = []
for word in a:
    if word != "" and word[0] != "@" and word[0] != "#":
        for item in re.split(r'\W+\'\W|\W+', word):
            if item != "":
                b.append(item)
            else:
                continue
    else:
        continue
print b

4 个答案:

答案 0 :(得分:1)

将所有这些规则组合成一个正则表达式更容易:

import re
a = "@luke5sos are you awake now?!!! me #hashtag time! is@ over, now okay....so they're rich....and hopefully available?"
b = re.findall(r"(?<![@#])\b\w+(?:'\w+)?", a)
print(b)

结果:

['are', 'you', 'awake', 'now', 'me', 'time', 'is', 'over', 'now', 'okay', 'so', "they're", 'rich', 'and', 'hopefully', 'available']

正则表达式的工作原理如下:

  1. 使用#检查以确保它在@(?<![@#])之后不正确。
  2. 使用\b检查它是否在一个单词的开头。这很重要,因此@ / #检查不会跳过一个字符并继续。
  3. 使用\w+匹配一个或多个“单词”类型字符的序列。
  4. 可选择将撇号和更多单词类型字符与(?:'\w)?匹配。
  5. 请注意,第四步是这样编写的,以便they're计为一个单词,但this只有thatthesethis, 'that', these将匹配。

答案 1 :(得分:0)

以下代码(a)将....视为单词分隔符,(b)删除尾随的非单词字符,例如问号和感叹号,以及(c)拒绝任何以{{开头的单词1}}或#或以其他方式包含非字母字符:

@

这会产生所需的结果:

a = "@luke5sos are you awake now?!!! me #hashtag time! is@ over, now okay....so they're rich....and hopefully available?"
a = a.replace('....', ' ')
a = re.sub('[?!@#$%^&]+( |$)', ' ', a)
result = [w for w in a.split() if w[0] not in '@#' and w.replace("'",'').isalpha()]
print result

答案 2 :(得分:0)

import re
v = re.findall(r'(?:\s|^)([\w\']+)\b', a)

给出:

['are', 'you', 'awake', 'now', 'me', 'time', 'is', 'over', 'now', 
 'okay', 'so', "they're", 'rich', 'and', 'hopefully', 'available']

答案 3 :(得分:-1)

根据我的理解,您不想要带有数字的字词,并且您想要忽略除单引号之外的所有其他特殊字符。你可以尝试这样的事情:

 import re
 a = re.sub('[^0-9a-zA-Z']+', ' ', a)
 b = a.split()

我还没能尝试语法,但希望它能够正常运行。我建议用一个空格替换不是aplha-numberic或 single qoute 的每个字符。因此,这会产生一个字符串,其中您的必需字符串由多个空格分隔。只需在没有参数的情况下调用split函数,就可以将字符串拆分为单词,同时处理多个空格。希望它有所帮助。