我试图通过删除字母数字单词(包含字母和数字的单词)来清理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
但我不太清楚如何将这个例外列表合并到我的正则表达式中(我对这个概念很新)。非常感谢任何见解!
答案 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']