我知道这是一个常见的问题,但我没有找到适用的答案。我试图从一个单词列表中删除标点符号,这是我在早期函数中抓取HTML页面时得到的。这就是我所拥有的:
import re
def strip_text():
list_words = get_text().split()
print(list_words)
for i in range(len(list_words)):
list_words = re.sub("[^a-zA-Z]"," ",list_words)
list_words = list_words.lower()
return list_words
print(get_text())
print(strip_text())
我意识到这不起作用,因为re.sub位应该用于字符串,而不是列表。有同样有效的方法吗?我应该再将单词列表作为字符串吗?
编辑:这个问题是从HTML页面抓取文本,就像我说的那样。我之前的代码看起来像这样:
from bs4 import BeautifulSoup
import requests
from collections import Counter
import re
tokens = []
types= Counter(tokens)
#str_book = ""
str_lines = ""
import string
def get_text():
# str_lines = ""
url = 'http://www.gutenberg.org/files/1155/1155-h/1155-h.htm'
r = requests.get(url)
data = r.text
soup = BeautifulSoup(data, 'html.parser')
text = soup.find_all('p') #finds all of the text between <p>
i=0
for p in text:
i+=1
line = p.get_text()
if (i<10):
continue
print(line)
return line
因此,单词列表将是我正在使用的Agatha Christie书中所有单词的列表。希望这会有所帮助。
答案 0 :(得分:3)
您根本不需要regex
。 string.punctuation
包含所有标点符号。只需迭代并跳过这些。
>>> import string
>>> ["".join( j for j in i if j not in string.punctuation) for i in lst]
答案 1 :(得分:1)
看一下get_text()
,看来我们需要修改一些内容才能删除任何标点符号。我在这里添加了一些评论。
def get_text():
str_lines = [] # create an empty list
url = 'http://www.gutenberg.org/files/1155/1155-h/1155-h.htm'
r = requests.get(url)
data = r.text
soup = BeautifulSoup(data, 'html.parser')
text = soup.find_all('p') #finds all of the text between <p>
i=0
for p in text:
i+=1
line = p.get_text()
if (i<10):
continue
str_lines.append(line) # append the current line to the list
return str_lines # return the list of lines
首先,我取消注释了您的str_lines
变量并将其设置为空列表。接下来,我用代码替换了print
语句,将该行附加到行列表中。最后,我更改了return
语句以返回该行列表。
对于strip_text()
,我们可以将其缩减为几行代码:
def strip_text():
list_words = get_text()
list_words = [re.sub("[^a-zA-Z]", " ", s.lower()) for s in list_words]
return list_words
不需要按字词操作,因为我们可以查看整行并删除所有标点符号,因此我删除了split()
。使用列表推导,我们可以在一行中更改列表的每个元素,并且还将lower()
方法放在那里以压缩代码。
要实现@AhsanulHaque提供的答案,您只需要用它替换strip_text()
方法的第二行,如下所示:
def strip_text():
list_words = get_text()
list_words = ["".join(j.lower() for j in i if j not in string.punctuation)
for i in list_words]
return list_words
为了好玩,以下是我之前提到的为Python 3.x实现的translate
方法,如here所述:
def strip_text():
list_words = get_text()
translator = str.maketrans({key: None for key in string.punctuation})
list_words = [s.lower().translate(translator) for s in list_words]
return list_words
不幸的是,我无法为你的特定代码计算任何时间,因为Gutenberg暂时阻止了我(我猜想代码运行得太快了。)