2009-12-12 19 views
0

我想创建正则表达式来过滤文本文件中的某些文本。我想要过滤的格式如下:如何在Python中创建正则表达式?

word_*_word.word 

例如,我想每个匹配的python代码。样品结果将为:

program1_0.0-1_log.build 
program2_0.1-3_log.build 

我该怎么做?

非常感谢您的帮助

回答

3

尝试这样:

r'[a-zA-Z0-9]+_[^_]+_[a-zA-Z0-9]+\.[a-zA-Z0-9]+' 
0

尝试^\w+_.*_\w+\.\w+$

+0

你不会得到“每一场比赛”,作为OP的愿望,通过固定的模式,使其只匹配的整行(如果你还记得指定'重.MULTILINE' - 否则,只有整个文件,并且只有在没有指定're.DOTALL' ;-)的情况下没有新行。 – 2009-12-12 23:36:09

1

Python的正则表达式模块称为re。您需要将其导入和使用provided functions

import re 
if re.match(r'\w+_.*_\w+.\w+', "some_text_abc.x"): 
    print "yeah." 

它与r前缀正则表达式字符串,所以,这将是字面解释,无需特殊处理转义字符有用。否则,反斜杠将被python解释器专门处理,并且正则表达式的一部分的反斜杠需要被转义。

+0

这与匹配“任意数目的下划线”似乎很奇怪(并且不符合OP的示例)。 – 2009-12-12 23:34:34

+0

@Alex:你说的没错,我修正了 – sth 2009-12-12 23:37:49

+0

@sth,tx - 同样,'re.match'只匹配字符串的_start_(就好像模式以隐含的'^'开始,在感觉),所以它可能不会像OP所要求的那样得到文件中的“每一个匹配”。 – 2009-12-12 23:39:29

2

看起来你想使用模式,如r'\w+_.*_\w+\.\w+' - 假设*你有没有表示“零个或多个完全任意字符”(如果没有,那么中间的.*部分需要相应更改)。一旦你有正确的模式(具体取决于你的意思* ;-),你可以re.compile它得到一个正则表达式对象,并使用RE对象的.findall方法,以整个字符串作为参数,得到一个匹配这个模式的所有非重叠子串的列表(如果你想一次获得一个这样的子串,也可以循环使用这些子串),也可以使用其他的替代方法,如.finditer

0

我不明白你为什么需要这里的正则表达式。 如果你想字符串以“.build”结尾,比如,你可以

s="blah blah program1_0.0-1_log.build blah blah"  
for item in s.split(): 
    if item.endswith(".build"): 
     print item 

做到这一点,仅此而已。如果你想要做进一步的检查,然后

for item in s.split(): 
    if item.endswith(".build"): 
     s = item.split("_") 
     if len(s) != 3: 
      print "not enough _" 
+0

您可能更喜欢使用正则表达式来查找具有1行代码的东西,而不是多行循环。 – 2009-12-13 06:52:41

+0

我很少使用Python的正则表达式,除非绝对必要。 IMO使用Python的内部字符串方法也更快。 – ghostdog74 2009-12-13 08:10:19