使用 Grep 和 Regex 从 .txt 中去除 URL 字符串

Using Grep & Regex to strip URL strings from .txt

我在找出从 .txt 文件中删除 URLs 的最佳方法时遇到问题。我意识到正则表达式可能是最好的解决方法,但我已经有一段时间没有在 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 {*

如您所见,一团糟。至少似乎在每个 URL 之前总是有一个 'HYPERLINK "' 并且在之后总是有一个 'fref' 所以我可以使用正则表达式行首和行尾运算符。

我在想这个:

grep ^HYPERLINK $fref testsample.txt | echo output.txt

但这对我不起作用。所需的输出在新文件中如下所示:

link1
link2
linkn...

更新:我发现了如何使用以下命令提取 URLs 并将它们放入新文件中:

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。非常感谢任何有关配置 'end of line' 参数的帮助。

已解决

grep -Eo '\"https?:\/\/[^"]+\"' testsample.txt > testfile2.txt 

假设 link 总是用双引号引起来:

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

Demo

详情:

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

要使用 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"

使用您的假设,并且 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'