我想通过从文本中删除一定长度的数字来净化文本,因此我为文本定义了规则。我认为isdigit
很适合处理,但是如果我使用它,它将丢弃文本中的所有数字。在我的测试中,最后10位数字没有贡献给文本,因此我可以将其删除。这是我尝试过的:
urls = ['variety.com/2017/biz/news/tax-march-donald-trump-protest-1202031487/',
'variety.com/2018/film/news/list-2018-oscar-nominations-1202668757/']
cols = ['c1', 'c2', 'c3', 'c4']
make_me = []
for url in urls:
lst = url.split("/")
# your business rules go here
make_me.append([x for x in lst if not x.isdigit() and not x == ""])
df = pd.DataFrame(make_me, columns=cols)
df
res=[]
for i in df.c4:
lst=i.split("-")
res.append([''.join(x) for x in lst if not x.isdigit()])
我的尝试放弃了文本中的所有数字。我只想要这种输出:
tax march donald trump protest
list 2018 oscar nominations
如何编写规则以获取此输出?有想法吗?
答案 0 :(得分:1)
假设您要提取相同格式的网址,请使用正则表达式
import re
urls = ['variety.com/2017/biz/news/tax-march-donald-trump-protest-1202031487/',
'variety.com/2018/film/news/list-2018-oscar-nominations-1202668757/']
news = []
regex =re.compile(r'/news/(.*)-')
for url in urls:
extract_id = regex.search(url)
if extract_id:
data = extract_id.group(1)
news.append(data.replace('-',' '))
print(news)
输出
['tax march donald trump protest', 'list 2018 oscar nominations']
已修改格式以适合该问题。
答案 1 :(得分:1)
没有其他模块的纯python方式如下:
urls = ['variety.com/2017/biz/news/tax-march-donald-trump-protest-1202031487/',
'variety.com/2018/film/news/list-2018-oscar-nominations-1202668757/']
for x in urls:
print(' '.join(x.rsplit('/', 2)[-2].split('-')[:-1]))
# tax march donald trump protest
# list 2018 oscar nominations
如果需要输出列表,请使用列表理解:
[' '.join(x.rsplit('/', 2)[-2].split('-')[:-1]) for x in urls]
答案 2 :(得分:0)
可以有很多方法。使用.rfind('-')
来获取'-'的最右边的索引,然后对字符串进行切片。之后,您可以进一步处理字符串。
答案 3 :(得分:0)
在这种情况下,您有一条非常具体的规则可以帮助您-只需从最后一个有趣的元素中删除最后10个字符即可。
在这种情况下,lst[-2] = lst[-2][:-12]
调用之前的make_me.append
可以解决问题。
如果您确实想使用正则表达式,则可以使用行尾标记$来确保数字位于末尾。看起来像
lst = re.sub('[0-9]{10}/$','',url)
re
之后。内容为:
re.sub是正则表达式模块中的一种替换方法,它将第一个参数中与正则表达式的匹配更改为第二个参数中的内容;第三个参数是您要替换的字符串。
我写的正则表达式匹配“由10个字符组成的序列,它们与0123456789中的任何一个匹配,后跟一个/和字符串的结尾”。