将字符串拆分为单词和标点符号

2025-03-05 09:15:00
admin
原创
32
摘要:问题描述:我正在尝试将字符串拆分成单词和标点符号,并将标点符号添加到拆分生成的列表中。例如:>>> c = "help, me" >>> print c.split() ['help,', 'me'] 我真正想要的列表是这样的:['help', ',',...

问题描述:

我正在尝试将字符串拆分成单词和标点符号,并将标点符号添加到拆分生成的列表中。

例如:

>>> c = "help, me"
>>> print c.split()
['help,', 'me']

我真正想要的列表是这样的:

['help', ',', 'me']

所以,我希望将字符串在空格处分割,并将标点符号与单词分割开。

我尝试先解析字符串,然后运行拆分:

>>> for character in c:
...     if character in ".,;!?":
...             outputCharacter = " %s" % character
...     else:
...             outputCharacter = character
...     separatedPunctuation += outputCharacter
>>> print separatedPunctuation
help , me
>>> print separatedPunctuation.split()
['help', ',', 'me']

这产生了我想要的结果,但是对于大文件来说速度非常慢。

有没有办法更有效地做到这一点?


解决方案 1:

这或多或少是这样做的方法:

>>> import re
>>> re.findall(r"[w']+|[.,!?;]", "Hello, I'm a string!")
['Hello', ',', "I'm", 'a', 'string', '!']

诀窍在于,不要考虑在哪里分割字符串,而是考虑在标记中包含什么。

注意事项:

  • 下划线 (_) 被视为单词内部字符。如果您不想这样,请替换 \w。

  • 这对于字符串中的(单)引号不起作用。

  • 将您想要使用的任何其他标点符号放在正则表达式的右半部分。

  • 其中未明确提及的任何内容都会被默默删除。

解决方案 2:

这是一个支持 Unicode 的版本:

re.findall(r"w+|[^ws]", text, re.UNICODE)

第一个替代方案捕获单词字符序列(由unicode定义,因此“résumé”不会变成['r', 'sum']);第二个替代方案捕获单个非单词字符,忽略空格。

请注意,与最佳答案不同,这将单引号视为单独的标点符号(例如 "I'm" -> ['I', "'", 'm'])。这似乎是 NLP 中的标准,所以我认为它是一个功能。

解决方案 3:

如果您要使用英语(或其他一些常用语言)工作,您可以使用NLTK(还有许多其他工具可以做到这一点,例如FreeLing)。

import nltk
nltk.download('punkt')
sentence = "help, me"
nltk.word_tokenize(sentence)

解决方案 4:

这是我的参赛作品。

我怀疑这在效率方面能否保持良好,或者它是否能涵盖所有情况(请注意“!!!”组合在一起;这可能是也可能不是一件好事)。

>>> import re
>>> import string
>>> s = "Helo, my name is Joe! and i live!!! in a button; factory:"
>>> l = [item for item in map(string.strip, re.split("(W+)", s)) if len(item) > 0]
>>> l
['Helo', ',', 'my', 'name', 'is', 'Joe', '!', 'and', 'i', 'live', '!!!', 'in', 'a', 'button', ';', 'factory', ':']
>>>

如果您要逐行执行此操作,一个明显的优化就是预先编译正则表达式(使用 re.compile)。

解决方案 5:

这对我有用

import re

i = 'Sandra went to the hallway.!!'
l = re.split('(W+?)', i)
print(l)

empty = ['', ' ']
l = [el for el in l if el not in empty]
print(l)

Output:
['Sandra', ' ', 'went', ' ', 'to', ' ', 'the', ' ', 'hallway', '.', '', '!', '', '!', '']
['Sandra', 'went', 'to', 'the', 'hallway', '.', '!', '!']

解决方案 6:

这是对您的实现的一个小更新。如果您尝试做任何更详细的事,我建议您查看 le dorfier 建议的 NLTK。

这可能只会快一点,因为使用 ''.join() 代替 +=,而已知后者更快。

import string

d = "Hello, I'm a string!"

result = []
word = ''

for char in d:
    if char not in string.whitespace:
        if char not in string.ascii_letters + "'":
            if word:
                    result.append(word)
            result.append(char)
            word = ''
        else:
            word = ''.join([word,char])

    else:
        if word:
            result.append(word)
            word = ''
print result
['Hello', ',', "I'm", 'a', 'string', '!']

解决方案 7:

我想出了一种方法来标记所有单词和W+模式,不需要硬编码:

>>> import re
>>> sentence = 'Hello, world!'
>>> tokens = [t.strip() for t in re.findall(r'.*?S.*?(?:|$)', sentence)]
['Hello', ',', 'world', '!']

.*?S.*?是一个模式,匹配任何非空格的内容,$如果它是标点符号,则添加以匹配字符串中的最后一个标记。

但请注意以下几点——这将对由多个符号组成的标点符号进行分组:

>>> print [t.strip() for t in re.findall(r'.*?S.*?(?:|$)', '"Oh no", she said')]
['Oh', 'no', '",', 'she', 'said']

当然,你可以使用以下方法查找并拆分此类组:

>>> for token in [t.strip() for t in re.findall(r'.*?S.*?(?:|$)', '"You can", she said')]:
...     print re.findall(r'(?:w+|W)', token)

['You']
['can']
['"', ',']
['she']
['said']

解决方案 8:

尝试一下:

string_big = "One of Python's coolest features is the string format operator  This operator is unique to strings"
my_list =[]
x = len(string_big)
poistion_ofspace = 0
while poistion_ofspace < x:
    for i in range(poistion_ofspace,x):
        if string_big[i] == ' ':
            break
        else:
            continue
    print string_big[poistion_ofspace:(i+1)]
    my_list.append(string_big[poistion_ofspace:(i+1)])
    poistion_ofspace = i+1

print my_list

解决方案 9:

如果您不被允许导入任何东西,请使用这个!

word = "Hello,there"
word = word.replace("," , " ," )
word = word.replace("." , " .")
return word.split()
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1950  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1439  
  在企业运营过程中,跨部门协作效率的高低直接影响着项目的推进速度与质量,进而关乎企业的整体竞争力。PLM(产品生命周期管理)项目管理软件作为一种强大的工具,正逐渐在提升跨部门协作效率方面发挥着关键作用。它打破了部门之间的信息壁垒,优化了业务流程,为企业各部门之间的协同工作提供了有力支持。PLM项目管理软件打破信息壁垒信息...
plm合规性管理   17  
  PLM(Product Lifecycle Management)软件,即产品生命周期管理软件,旨在助力企业对产品从概念设计到退役处理的全生命周期进行有效管理。通过整合产品数据、流程以及人员,PLM软件能显著提升企业的创新能力、生产效率并降低成本。然而,PLM软件的实施并非易事,众多企业在落地过程中遭遇诸多挑战。要实现...
国内plm系统排名   19  
  研发过程的可视化对于企业提升效率、保障项目顺利推进至关重要。PLM(产品生命周期管理)系统作为整合产品全生命周期信息的重要工具,与甘特图相结合,能为研发过程可视化提供强大支持。通过对PLM系统支撑下甘特图的优化展现,可以让项目团队成员、管理层等清晰了解研发进度、资源分配等关键信息,从而做出更科学的决策。接下来,我们将详...
plm系统主要干什么的   16  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用