我有一个字符串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
答案 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']
正则表达式的工作原理如下:
#
检查以确保它在@
或(?<![@#])
之后不正确。\b
检查它是否在一个单词的开头。这很重要,因此@
/ #
检查不会跳过一个字符并继续。\w+
匹配一个或多个“单词”类型字符的序列。(?:'\w)?
匹配。请注意,第四步是这样编写的,以便they're
计为一个单词,但this
只有that
,these
和this, '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
函数,就可以将字符串拆分为单词,同时处理多个空格。希望它有所帮助。