【问题标题】:Regex: how to remove single characters that are not words?正则表达式:如何删除不是单词的单个字符?
【发布时间】:2019-12-08 07:47:20
【问题描述】:

我觉得这肯定是在其他地方问过的,但尽我所能,我在这里或网上其他地方都没有找到类似的问题。

在 Python 中,当我清理一个长文本文件并准备好一长串 regex 命令时,我最终看到单字符单词,如 "I""a",不幸的是被删除。

有没有办法使用regex(或其他)来执行以下操作?

re.sub(r"\non-word-single-character", "", "I want a b c cat")
"I want a cat"

提前致谢。

【问题讨论】:

  • 通过消除,a, i, o, u, v 是唯一用于 text-speak (o : Oh!, u : you, v : we) 的字母,除此之外没有其他字母一封信就有意义,对吧?
  • 嗯,我想必须使用一个全面的映射,这将匹配所有可能的非 l33t-speak、非缩短短语并将它们替换为预期的实际单词,并匹配 where solitary字符就是这样,删除那些。我想知道是否有人已经尝试过这样的任务(可能是我想象的某个 nlp 库);我得调查一下。

标签: python regex text data-cleaning


【解决方案1】:

我不认为正则表达式是一个合适的工具。您需要识别标记是否是自然语言中的有效单词。Regex 不提供用于自然语言处理的工具。您宁愿使用字典或 NLP 库来识别有效单词。

【讨论】:

    【解决方案2】:

    简单而优雅的解决您的问题恕我直言。 \\b 表示单词边界。

    代码:

    import re
    re.sub('\\b[^(aiouvAIOUV)]{1} \\b', '', "I want a b c cat")
    

    输出:

    'I want a cat'
    

    【讨论】:

    • 谢谢!我正在查看您的评论并玩弄您的解决方案,并想知道为什么 re.sub(r"\s[^aiouv0-9]\s", " ", "I want a b c cat 2") 不起作用并正在创建 ''I want a c cat 2',但我认为这与您使用 \\b 而不是使用 r 有关?
    • \\b 是一个断词,没有什么新鲜事。它有一个官方名称,我现在似乎不记得了。 r'khskd' 是原始字符串,它破坏了这里的目的。所以。
    • 如果要包含很多字母并且大小写无关紧要,对代码的一个小调整是在 re.sub 的末尾添加 0, re.IGNORECASE 并将 aiouvAIOUV 更改为艾尤夫。 0 表示更改正则表达式的所有实例(默认行为),re.IGNORECASE 是一个标志,可以忽略大小写。
    猜你喜欢
    • 2013-10-30
    • 2017-01-18
    • 2020-09-03
    • 1970-01-01
    • 2011-01-05
    • 2021-08-07
    • 2020-01-25
    • 2014-06-21
    • 2013-08-23
    相关资源
    最近更新 更多