我正在尝试学习python,同时使用NLTK进行文本分析。你知道吗
我正在使用python在文本分析之前清除文本。你知道吗
给出句子:The target IP was: 127.1.1.100.
我想把它标记为:
["The", "target", "IP", "was", ":","127.1.1.100","."]
保留所有标点符号以重建源文档很重要,但我需要分隔前导/尾随标点符号,以便对单个单词进行文本分析。我写了下面的python代码,它工作得很好,但是看起来有点笨拙。你知道吗
punct = ['.', ',', ':', ';', '!', '[', ']', '(', ')', '{', '}']
def split_punctuation(sentence)-> list:
sentwords = sentence.split(" ")
for i, word in enumerate(sentwords):
if word_ends_with_punct(word) and len(word) > 1:
sentwords.pop(i)
sentwords.insert(i, word[:-1])
sentwords.insert(i+1, word[-1])
word = word[:-1]
if word_starts_with_punct(word) and len(word) > 1:
sentwords.pop(i)
sentwords.insert(i, word[0:1])
sentwords.insert(i+1, word[1:])
word = word[1:]
return sentwords
def word_starts_with_punct(w)-> bool:
for p in punct:
if w.startswith(p):
return True
return False
def word_ends_with_punct(w)->bool:
for p in punct:
if w.endswith(p):
return True
return False
所以我找了一个正则表达式来做我想做的,有点。。。 RegEx by Wiktor Stribiżew
re.sub(r'[]!"$%&\'()*+,./:;=#@?[\\^_`{|}~-]+', r' \g<0> ', my_text).strip()
我能搞清楚发生了什么,但在这种形式下,它把所有的标点分开,甚至在单词中间。例如,它将今天的日期转换为:
6/28/2109
到"6 / 28 / 2019"
。你知道吗
所以我修改了在开始/结束处使用锚定标记,但似乎我必须运行它两次,一次用于开始标点,另一次用于结束。似乎效率很低,希望有人能拿出正确的方法来实现这一点。以下代码是regex版本:
def sep_punct_by_regex(sent)->list :
words = sent.split(" ")
new_words = []
for w in words:
tmp1 = re.sub(r'^[]!"$/%&\'()*+,.:;=#@?[\\^_`{|}~-]+', r' \g<0> ', w).strip()
tmp2 = re.sub(r'[]!"$/%&\'()*+,.:;=#@?[\\^_`{|}~-]+$', r' \g<0> ', tmp1).strip()
t = tmp2.split(" ")
for x in t:
new_words.append(x)
return new_words
注意tmp1中的^
和tmp2中的$
这是按原样工作的,但目标是在构建时学习,因此如何修改RegEx以进行单次传递?我在前面尝试了明显的(^
),在最后尝试了$
,但是没有成功。你知道吗
你可以用
参见regex demo
要删除字符串两端的标点符号并从空白中删除,请使用
所以,看起来
细节
\b(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\b
-anIPv4 regex pattern|
-或[^\W_]+
-一个或多个字母或数字|
-或(?:[^\w\s]|_)+
-除单词和空格字符或_
以外的一个或多个字符。你知道吗相关问题 更多 >
编程相关推荐