我在找出从.txt文件中删除网址的最佳方法时遇到了问题。我意识到正则表达式可能是最好的方法,但是我用Python做了一些事情已经有一段时间了。不是家庭作业问题,只是个人项目。
以下是该文件的示例:
738 \ loch \ af4 \ dbch \ af31505 \ hich \ f4 \ u8232 \' 5f} {\ field {* \ fldinst {\ rtlch \ fcs1 \ af4 \ ltrch \ fcs0 \ f4 \ cf1 \ insrsid10228738 \ hich \ af4 \ dbch \ af31505 \ loch \ f4 HYPERLINK" https://archive.org/randomURL1?fref=grp_mmbr_list"} { \ rtlch \ fcs1 \ af4 \ ltrch \ fcs0 \ f4 \ cf1 \ insrsid10228738 {* \ datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b31505 \ hich \ f4 \ u8232 \' 5f} {\ field {* \ fldinst {\ rtlch \ fcs1 \ af4 \ ltrch \ fcs0 \ f4 \ cf1 \ insrsid10228738 \ hich \ af4 \ dbch \ af31505 \ loch \ f4 HYPERLINK" https://archive.org/randomURL2?fref=grp_mmbr_list"} {\ rtlch \ fcs1 \ af4 \ ltrch \ fcs0 \ f4 \ cf1 \ insrsid10228738 {*
正如你所看到的,这是一团糟。至少看起来总有一个' HYPERLINK''在每个网址和一个' fref'之前之后,我可以使用正则表达式的行和行结束运算符。
我在想这个:
grep ^HYPERLINK $fref testsample.txt | echo output.txt
但它不适合我。所需的输出在新文件中如下所示:
link1
link2
linkn...
更新:我发现如何使用此命令提取URL并将其放入新文件中:
grep 'https://www\.[[:alpha:]]\+\.[[:alpha:]]\+' testsample.txt > testfile2.txt
但我的输出看起来像这样:
\ f4 \ cf1 \ insrsid10228738 \ loch \ af4 \ dbch \ af31505 \ hich \ f4 \ u8232 \' 5f} {\ field {* \ fldinst {\ rtlch \ fcs1 \ af4 \ ltrch \ fcs0 \ f4 \ cf1 \ insrsid10228738 \ hich \ af4 \ dbch \ af31505 \ loch \ f4 HYPERLINK" httjps://archive.org/randomURL1?fref = grp_mmbr_list"} { \ loch \ af4 \ dbch \ af31505 \ hich \ f4 \ u8232 \' 5f} {\ field {* \ fldinst {\ rtlch \ fcs1 \ af4 \ ltrch \ fcs0 \ f4 \ cf1 \ insrsid10228738 \ hich \ af4 \ dbch \ af31505 \ loch \ f4 HYPERLINK" httjps://archive.org/randomURL1?fref = grp_mmbr_list"} {\ rtlch \ fcs1 \ af4 \ ltrch \ fcs0 \ f4 \ cf1 \ insrsid10228738 \ loch \ af4 \ dbch \ af31505 \ hich \ f4 \ u8232 \' 5f} {\ field {* \ fldinst {\ rtlch \ fcs1 \ af4 \ ltrch \ fcs0 \ f4 \ cf1 \ insrsid10228738 \ hich \ af4 \ dbch \ af31505 \ loch \ f4 HYPERLINK" httjps://archive.org/randomURL2?fref = grp_mmbr_list"} {
似乎它拉动了整条线而不仅仅是URL。任何有助于对行结束的帮助'参数将非常感激。
解决
grep -Eo '\"https?:\/\/[^"]+\"' testsample.txt > testfile2.txt
答案 0 :(得分:0)
答案 1 :(得分:0)
使用grep
命令将所有链接提取到新文件中:
grep -Po '\"\Khttps?:\/\/[^"]+(?=\")' testsample.txt > testfile2.txt
现在,testfile2.txt
文件应包含以下内容:
https://archive.org/randomURL1?fref=grp_mmbr_list
https://archive.org/randomURL2?fref=grp_mmbr_list
注意:如果您不支持-P
选项,请使用-E
来扩展正则表达式:
grep -Eo '\"https?:\/\/[^"]+\"' testsample.txt > testfile2.txt
要从初始文件中删除所有链接(就地),请使用sed
命令
使用-ri
选项:
sed -ri 's/\"https?:\/\/[^"]+\"//g' /tmp/testsample.txt
使用re.sub()
函数的替代解决方案(使用测试字符串而不是文件):
import re
s = '''
738 \loch\af4\dbch\af31505\hich\f4 \u8232\'5f}{\field{*\fldinst {\rtlch\fcs1 \af4 \ltrch\fcs0 \f4\cf1\insrsid10228738 \hich\af4\dbch\af31505\loch\f4 HYPERLINK "https://archive.org/randomURL1?fref=grp_mmbr_list"}{ \rtlch\fcs1 \af4 \ltrch\fcs0 \f4\cf1\insrsid10228738 {*\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b31505\hich\f4 \u8232\'5f}{\field{*\fldinst {\rtlch\fcs1 \af4 \ltrch\fcs0 \f4\cf1\insrsid10228738 \hich\af4\dbch\af31505\loch\f4 HYPERLINK "https://archive.org/randomURL2?fref=grp_mmbr_list"}{\rtlch\fcs1 \af4 \ltrch\fcs0 \f4\cf1\insrsid10228738 {*
'''
result = re.sub(r'\"https?:\/\/[^"]+\"', '', s)
print(repr(result))
输出:
"\n738 \\loch\x07f4\\dbch\x07f31505\\hich\x0c4 舲'5f}{\x0cield{*\x0cldinst {\rtlch\x0ccs1 \x07f4 \\ltrch\x0ccs0 \x0c4\\cf1\\insrsid10228738 \\hich\x07f4\\dbch\x07f31505\\loch\x0c4 HYPERLINK }{ \rtlch\x0ccs1 \x07f4 \\ltrch\x0ccs0 \x0c4\\cf1\\insrsid10228738 {*\\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b31505\\hich\x0c4 舲'5f}{\x0cield{*\x0cldinst {\rtlch\x0ccs1 \x07f4 \\ltrch\x0ccs0 \x0c4\\cf1\\insrsid10228738 \\hich\x07f4\\dbch\x07f31505\\loch\x0c4 HYPERLINK }{\rtlch\x0ccs1 \x07f4 \\ltrch\x0ccs0 \x0c4\\cf1\\insrsid10228738 {*\n"
答案 2 :(得分:0)
使用您的假设,并且URL始终以双引号开头:
>>> content = open('testsample.txt').read()
>>> import re
>>> oneLink = re.compile(r'HYPERLINK\s+"(.*?)\?fref=')
>>> for link in oneLink.findall(content):
... link
...
'https://archive.org/randomURL1'
'https://archive.org/randomURL2'