我想创建正则表达式来过滤文本文件中的某些文本。我想要过滤的格式如下:如何在Python中创建正则表达式?
word_*_word.word
例如,我想每个匹配的python代码。样品结果将为:
program1_0.0-1_log.build
program2_0.1-3_log.build
我该怎么做?
非常感谢您的帮助
我想创建正则表达式来过滤文本文件中的某些文本。我想要过滤的格式如下:如何在Python中创建正则表达式?
word_*_word.word
例如,我想每个匹配的python代码。样品结果将为:
program1_0.0-1_log.build
program2_0.1-3_log.build
我该怎么做?
非常感谢您的帮助
尝试这样:
r'[a-zA-Z0-9]+_[^_]+_[a-zA-Z0-9]+\.[a-zA-Z0-9]+'
尝试^\w+_.*_\w+\.\w+$
Python的正则表达式模块称为re
。您需要将其导入和使用provided functions:
import re
if re.match(r'\w+_.*_\w+.\w+', "some_text_abc.x"):
print "yeah."
它与r
前缀正则表达式字符串,所以,这将是字面解释,无需特殊处理转义字符有用。否则,反斜杠将被python解释器专门处理,并且正则表达式的一部分的反斜杠需要被转义。
这与匹配“任意数目的下划线”似乎很奇怪(并且不符合OP的示例)。 – 2009-12-12 23:34:34
@Alex:你说的没错,我修正了 – sth 2009-12-12 23:37:49
@sth,tx - 同样,'re.match'只匹配字符串的_start_(就好像模式以隐含的'^'开始,在感觉),所以它可能不会像OP所要求的那样得到文件中的“每一个匹配”。 – 2009-12-12 23:39:29
看起来你想使用模式,如r'\w+_.*_\w+\.\w+'
- 假设*
你有没有表示“零个或多个完全任意字符”(如果没有,那么中间的.*
部分需要相应更改)。一旦你有正确的模式(具体取决于你的意思*
;-),你可以re.compile
它得到一个正则表达式对象,并使用RE对象的.findall
方法,以整个字符串作为参数,得到一个匹配这个模式的所有非重叠子串的列表(如果你想一次获得一个这样的子串,也可以循环使用这些子串),也可以使用其他的替代方法,如.finditer
。
我不明白你为什么需要这里的正则表达式。 如果你想字符串以“.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 _"
您可能更喜欢使用正则表达式来查找具有1行代码的东西,而不是多行循环。 – 2009-12-13 06:52:41
我很少使用Python的正则表达式,除非绝对必要。 IMO使用Python的内部字符串方法也更快。 – ghostdog74 2009-12-13 08:10:19
你不会得到“每一场比赛”,作为OP的愿望,通过固定的模式,使其只匹配的整行(如果你还记得指定'重.MULTILINE' - 否则,只有整个文件,并且只有在没有指定're.DOTALL' ;-)的情况下没有新行。 – 2009-12-12 23:36:09