使用Grep&正则表达式从.txt中剥离URL字符串

时间:2017-02-11 16:26:18

标签: python regex grep sanitization

我在找出从.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 

3 个答案:

答案 0 :(得分:0)

假设链接始终用双引号括起来:

https?:\/\/[^"]+

Demo

详细说明:

  • https?:\/\/ - 匹配http://https://
  • [^"]+ - 匹配一个或多个非"字符

答案 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'