Python 如何GREP包含特定字符的单词,而不是行,并打印整个单词

Python 如何GREP包含特定字符的单词,而不是行,并打印整个单词,python,regex,linux,bash,ubuntu,Python,Regex,Linux,Bash,Ubuntu,我有一个包含大量行和词的文件,例如以下示例: C742 C743 C744 C745 C835 C836 C837 C838 C839 C840 C841 C842 C843 C844 C845 C935 C936 C937 C938 C939 C940 C941 C942 C943 C944 C945 C1035 C1036 C1037 C1038 C1039 C1040 C1041 C1042 C1043 C1044 C1045 D135 D136 D137 D138 D139 D140 D

我有一个包含大量行和词的文件,例如以下示例:

C742 C743 C744 C745 C835 C836 C837 C838 C839 C840 C841 C842 C843 C844 C845 C935 C936 C937 C938 C939 C940 C941 C942 C943 C944 C945 C1035 C1036 C1037 C1038 C1039 C1040 C1041 C1042 C1043 C1044 C1045 D135 D136 D137 D138 D139 D140 D141 D142 D143 D144 D145 D235 D236 D237 D238 D239 D240 D241 D242 D243 D244 D245 D335 D336 D337 D338 D339 D340 D341 D342 D343 D344 D345 D435 D436 D437 D438 D439 D440 D441 D442 D443 D444
我想做的是只列出包含特定数字的单词(假设每个4个字符的捆绑是一个单词),例如
35

在本例中,我希望打印的结果为:

C835
C935
C1035
D135
D235
D335
D435

我尝试了几种不同的方法,比如使用grep只找到包含
35
的整行被打印,或者
grep-o35
只打印
35
而我不知道该数字的前缀是什么

尝试以下bash脚本:

cat words.txt | tr " " "\n" | grep 35
说明:
cat
读取words.txt并将其输出到STDOUT,STDOUT通过管道传输到
tr
,意思是“翻译”:在这种情况下,从空格(“”)到换行符(\n),然后,
grep
只执行其默认的逐行行为并搜索任何包含35的内容。

试试这个

for word in `cat filename`; do
    echo $word | grep 35
done
Python:

import re
s = "C742 C743 C744 C745 C835 C836 C837 C838 C839 C840 C841 C842 C843 C844 C845 C935 C936 C937 C938 C939 C940 C941 C942 C943 C944 C945 C1035 C1036 C1037 C1038 C1039 C1040 C1041 C1042 C1043 C1044 C1045 D135 D136 D137 D138 D139 D140 D141 D142 D143 D144 D145 D235 D236 D237 D238 D239 D240 D241 D242 D243 D244 D245 D335 D336 D337 D338 D339 D340 D341 D342 D343 D344 D345 D435 D436 D437 D438 D439    D440 D441 D442 D443 D444"
print(re.findall(r'[A-Z0-9]*35[0-9]*',s)) # assuming '35' can appear anywhere in the number.
输出:

['C835', 'C935', 'C1035', 'D135', 'D235', 'D335', 'D435']
您可以通过以下方式读取整个文件:

with open('words.txt') as f:
    s = f.read()

如果您还想使用Python来实现这一点:

>>> with open('file') as f:
...     print('\n'.join(i for i in f.read().split() if '35' in i))
...     
... 
C835
C935
C1035
D135
D235
D335
D435
这里,
f.read()
获取文件的内容,并将内容作为字符串对象返回
str.split()

但是,
(如果i中的'35',则i代表f.read().split())
是Python中的生成器理解,它返回一个生成器,并且元素中只有
'35'
。因此,我们可以使用它来获得预期的输出(在这种情况下不需要正则表达式)

最后,使用
'\n'.join()
将它们打印出来。您也可以使用
for
循环:

>>> with open('file') as f:
...     for i in (i for i in f.read().split() if '35' in i):
...         print(i)
...         
...     
... 
C835
C935
C1035
D135
D235
D335
D435

您可以扩展正则表达式以匹配所有组,但它有点混乱:

grep -o "[^ ]*35[^ ]*" words.txt

上面的
[^]*
部分将匹配任何非空格字符。

有一个标准的grep解决方案(\S用于非空格字符)


哇,这太棒了!我是bash脚本的初学者,但我正试图了解这个脚本。您介意解释一下它是如何工作的吗?@EricAngel Cat读取words.txt并将其吐出STDOUT,STDOUT通过管道传输到tr,意思是“翻译”:在这种情况下,从空格(“”)到换行符(\n),然后grep只执行默认的逐行行为并搜索任何包含35的内容。这很有意义,感谢您的帮助Pato-SáinzYou可以通过
tr”“\n”
避免呼叫
cat
,我尝试过使用grep和一些选项,但没有其他选择。我是bash脚本的初学者,所以我知道必须有一个快速修复方法,但我没能想出它。下面的几个人给我看了几行,让我完成了任务,谢谢!你想用Python还是bash?@KevinGuan他可能不关心哪种语言,而是关心它是否能解决他的问题。@EricAngel:如果答案正确,记得接受它。嗨。谢谢你的解决方案!你有没有办法解释这个“非空白字符”是如何工作的?我认为asterik调用的是匹配任何字符,而-o匹配的是确切的单词,但我很难找出其余的字符。grep的手册页没有显示任何/S或/S参数。谢谢
$ grep -o '\S*35\S*' words.txt
C835                                                                                                                  
C935                                                                                                                  
C1035                                                                                                                 
D135                                                                                                                  
D235                                                                                                                  
D335                                                                                                                  
D435