删除字母数字单词,在Python 3中有一些例外

时间:2017-10-28 00:43:39

标签: python regex

我试图通过删除字母数字单词(包含字母和数字的单词)来清理Python 3中的一些文本正文,但是我想在文本中保留一些例外情况。以下代码从文本中删除所有字母数字字词:

import re

string1 = "3n3k game gnma34 xbox360 table"
string2 = "the a22b b3kj3 ps4 2ij2aln potato"

new_string1 = re.sub(r'\w*\d\w*', '', string1)
new_string2 = re.sub(r'\w*\d\w*', '', string2)

上面的代码生成new_string1,它是“游戏桌”,new_string2是“土豆”。我需要的是new_string1是“游戏xbox360表”,new_string2是“ps4土豆”。

我想我可以创建一系列例外,例如:

exceptions = ['xbox360', 'ps4'] #there may be many more exceptions than this

但我不太清楚如何将这个例外列表合并到我的正则表达式中(我对这个概念很新)。非常感谢任何见解!

3 个答案:

答案 0 :(得分:3)

使用否定前瞻。否定前瞻是零长度:它与任何东西都不匹配;它要么成功要么失败,并且在完成之后,光标仍然是之前的位置。因此,您要检查单词边界(\b),检查以下文本是否在您的例外列表((?!...))中,并使用现有的正则表达式匹配单词({{ 1}})。

要构建前瞻的主体,只需将\w*\d\w*的元素与exceptions之间的元素连接在一起,或者只需使|成为与您要保留的单词匹配的正则表达式直接

我对Python并不熟悉,所以这里的正则表达式在示例中应该是什么样子,我希望你可以概括一下:

exceptions

删除空格

\b(?!xbox360|ps4)\w*\d\w*

答案 1 :(得分:1)

我找不到正则表达式,但这是实现它的一种方法

>>> exceptions = ['xbox360', 'ps4']
>>> string1 = "3n3k game gnma34 xbox360 table"

>>> " ".join([i if i in exceptions else re.sub(r'\w*\d\w*', '', i) for i in string1.split()])
' game  xbox360 table'
>>> string2 = "the a22b b3kj3 ps4 2ij2aln potato"

>>> " ".join([i if i in exceptions else re.sub(r'\w*\d\w*', '', i) for i in string2.split()])
'the   ps4  potato'

答案 2 :(得分:1)

使用双向方法:拆分并分析单词:

import re

strings = ["3n3k game gnma34 xbox360 table", "the a22b b3kj3 ps4 2ij2aln potato"]
exceptions = ['xbox360', 'ps4']

def cleanse(word):
    rx = re.compile(r'\D*\d')
    if rx.match(word) and word not in exceptions:
        return ''
    return word

nstrings = [" ".join(filter(None, (
    cleanse(word) for word in string.split()))) 
    for string in strings]
print(nstrings)
# ['game xbox360 table', 'the ps4 potato']

<小时/> 另外,我将正则表达式更改为

`\D*\d`

并尝试在每个“字词”的开头(re.match())匹配它们,因为\w也包含数字。

<小时/> 如果您能够升级到newer regex module,则无需使用函数即可使用(*SKIP)(*FAIL)和更好的表达式:

\b(?:xbox360|ps4)\b   # define your exceptions
(*SKIP)(*FAIL)        # these shall fail
|                     # or match words with digits
\b[A-Za-z]*\d\w*\b

请在此处查看a demo on regex101.com和完整的Python代码段:

import regex as re

strings = ["3n3k game gnma34 xbox360 table", "the a22b b3kj3 ps4 2ij2aln potato  123123 1234"]
exceptions = [r'\d+', 'xbox360', 'ps4']

rx = re.compile(r'\b(?:{})\b(*SKIP)(*FAIL)|\b[A-Za-z]*\d\w*\b'.format("|".join(exceptions)))

nstrings = [" ".join(
    filter(None, (rx.sub('', word) 
    for word in string.split()))) 
    for string in strings]
print(nstrings)
# ['game xbox360 table', 'the ps4 potato 123123 1234']