gpt4 book ai didi

python - 使用 python 进行正则表达式处理

转载 作者:行者123 更新时间:2023-12-01 07:39:10 27 4
gpt4 key购买 nike

我正在尝试学习 python 并同时使用 NLTK 进行文本分析。

我在文本分析之前使用 python 来清理文本。

给定句子:目标 IP 为: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()

我能够弄清楚发生了什么,但在这种形式下,它分隔了所有标点符号,即使是在单词中间。例如,它将今天的日期转换为:2109 年 6 月 28 日 更改为 “2019 年 6 月 28 日”

所以我修改为在开始/结束时使用 anchor 标记,但似乎我必须运行它两次,一次用于开始标点符号,另一次用于结束。看起来效率相当低,希望有人能展示完成此任务的正确方法。以下代码是正则表达式版本:

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 中的 $这是按原样工作的,但目标是在构建时学习,那么我将如何修改单遍的正则表达式?我尝试了前面明显的 (^) 和最后的 $,但它不起作用。

最佳答案

您可以使用

re.findall(r'\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|[^\W_]+|(?:[^\w\s]|_)+', s)

请参阅regex demo

要删除字符串两端的标点符号并删除空格,请使用

re.sub(r'^[\W_]+|[\W_]+$', '', s).strip()

所以,它看起来像

s = re.sub(r'^[\W_]+|[\W_]+$', '', s).strip()
oct = r'(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])'
return re.findall(r'\b{0}(?:\.{0}){{3}}\b|[^\W_]+|(?:[^\w\s]|_)+'.format(oct), s)

详细信息

  • \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 - 一个 IPv4 regex pattern
  • | - 或
  • [^\W_]+ - 一个或多个字母或数字
  • | - 或
  • (?:[^\w\s]|_)+ - 除单词和空白字符或 _ 之外的一个或多个字符。

关于python - 使用 python 进行正则表达式处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56812350/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com