从给定字符串中删除包含数字的单词
Removing words containing digits from a given string
我正在尝试编写一个简单的程序,从接收到的字符串中删除所有包含数字的单词。
这是我当前的实现:
import re
def checkio(text):
text = text.replace(",", " ").replace(".", " ") .replace("!", " ").replace("?", " ").lower()
counter = 0
words = text.split()
print words
for each in words:
if bool(re.search(r'\d', each)):
words.remove(each)
print words
checkio("1a4 4ad, d89dfsfaj.")
然而,当我执行这个程序时,我得到以下输出:
['1a4', '4ad', 'd89dfsfaj']
['4ad']
我不明白为什么 '4ad'
打印在第二行,因为它包含数字并且应该从列表中删除。有什么想法吗?
显然发生的是并发访问错误。即 - 您在遍历数组时删除了一个元素。
在第一次迭代中,我们有 words = ['1a4', '4ad', 'd89dfsfaj']。由于“1a4”有一个数字,我们将其删除。
现在,words = ['4ad','d89dfsfaj']。但是,在第二次迭代中,当前单词现在是 'd89dfsfaj',我们将其删除。发生的事情是我们跳过“4ad”,因为它现在位于索引 0 处,for 循环的当前指针位于 1。
如果您要测试字母数字字符串,为什么不使用 isalnum()
而不是正则表达式?
In [1695]: x = ['1a4', '4ad', 'd89dfsfaj']
In [1696]: [word for word in x if not word.isalnum()]
Out[1696]: []
假设您的正则表达式执行您想要的操作,您可以这样做以避免在迭代时删除。
import re
def checkio(text):
text = re.sub('[,\.\?\!]', ' ', text).lower()
words = [w for w in text.split() if not re.search(r'\d', w)]
print words ## prints [] in this case
此外,请注意我简化了您的 text = text.replace(...)
行。
此外,如果您不需要重复使用您的 text
变量,您可以使用正则表达式直接拆分它。
import re
def checkio(text):
words = [w for w in re.split('[,.?!]', text.lower()) if w and not re.search(r'\d', w)]
print words ## prints [] in this case
这可以通过使用 re.sub
、re.search
和 list_comprehension
来实现。
>>> import re
>>> def checkio(s):
print([i for i in re.sub(r'[.,!?]', '', s.lower()).split() if not re.search(r'\d', i)])
>>> checkio("1a4 4ad, d89dfsfaj.")
[]
>>> checkio("1a4 ?ad, d89dfsfaj.")
['ad']
我正在尝试编写一个简单的程序,从接收到的字符串中删除所有包含数字的单词。
这是我当前的实现:
import re
def checkio(text):
text = text.replace(",", " ").replace(".", " ") .replace("!", " ").replace("?", " ").lower()
counter = 0
words = text.split()
print words
for each in words:
if bool(re.search(r'\d', each)):
words.remove(each)
print words
checkio("1a4 4ad, d89dfsfaj.")
然而,当我执行这个程序时,我得到以下输出:
['1a4', '4ad', 'd89dfsfaj']
['4ad']
我不明白为什么 '4ad'
打印在第二行,因为它包含数字并且应该从列表中删除。有什么想法吗?
显然发生的是并发访问错误。即 - 您在遍历数组时删除了一个元素。
在第一次迭代中,我们有 words = ['1a4', '4ad', 'd89dfsfaj']。由于“1a4”有一个数字,我们将其删除。 现在,words = ['4ad','d89dfsfaj']。但是,在第二次迭代中,当前单词现在是 'd89dfsfaj',我们将其删除。发生的事情是我们跳过“4ad”,因为它现在位于索引 0 处,for 循环的当前指针位于 1。
如果您要测试字母数字字符串,为什么不使用 isalnum()
而不是正则表达式?
In [1695]: x = ['1a4', '4ad', 'd89dfsfaj']
In [1696]: [word for word in x if not word.isalnum()]
Out[1696]: []
假设您的正则表达式执行您想要的操作,您可以这样做以避免在迭代时删除。
import re
def checkio(text):
text = re.sub('[,\.\?\!]', ' ', text).lower()
words = [w for w in text.split() if not re.search(r'\d', w)]
print words ## prints [] in this case
此外,请注意我简化了您的 text = text.replace(...)
行。
此外,如果您不需要重复使用您的 text
变量,您可以使用正则表达式直接拆分它。
import re
def checkio(text):
words = [w for w in re.split('[,.?!]', text.lower()) if w and not re.search(r'\d', w)]
print words ## prints [] in this case
这可以通过使用 re.sub
、re.search
和 list_comprehension
来实现。
>>> import re
>>> def checkio(s):
print([i for i in re.sub(r'[.,!?]', '', s.lower()).split() if not re.search(r'\d', i)])
>>> checkio("1a4 4ad, d89dfsfaj.")
[]
>>> checkio("1a4 ?ad, d89dfsfaj.")
['ad']