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