【发布时间】:2009-12-12 23:21:02
【问题描述】:
我正在尝试创建正则表达式来过滤文本文件中的某些文本。我要过滤的格式如下:
word_*_word.word
例如,我希望每次匹配都使用 python 代码。示例结果为:
program1_0.0-1_log.build
program2_0.1-3_log.build
我该怎么做?
非常感谢您的帮助
【问题讨论】:
我正在尝试创建正则表达式来过滤文本文件中的某些文本。我要过滤的格式如下:
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]+'
【讨论】:
看起来您想使用诸如 r'\w+_.*_\w+\.\w+' 之类的模式——假设您拥有的 * 确实代表“零个或多个完全任意字符”(如果不是,那么中间的 .* 部分需要相应地改变)。一旦你有正确的模式(完全取决于你的意思是*;-),你可以re.compile它得到一个正则表达式对象,并使用RE对象的.findall方法,你的整体string 作为参数,以获取与此模式匹配的所有非重叠子字符串的列表(还有其他选择,例如 .finditer,如果您想一次获取一个这样的子字符串,则循环遍历它们)。
【讨论】:
Python 的正则表达式模块称为re。你需要导入它并使用provided functions:
import re
if re.match(r'\w+_.*_\w+.\w+', "some_text_abc.x"):
print "yeah."
在正则表达式字符串前加上r 是很有用的,这样它就可以按字面意思解释,而无需对转义字符进行特殊处理。否则反斜杠将被 python 解释器特殊处理,并且作为正则表达式一部分的反斜杠需要被转义。
【讨论】:
re.match 仅匹配字符串的 start (在某种意义上,就好像模式以隐含的 ^ 开头) 所以它可能不会按照 OP 的要求在文件中获得“每个匹配项”。
re 模块,它是文档,也是基本用法。在我看来,这是 OP 首先要解决的基本问题,然后才关心确切的正则表达式以及应该匹配的内容。 (我基本上只关注 in python 部分,而不是 what 正则表达式 部分)
试试^\w+_.*_\w+\.\w+$
【讨论】:
re.MULTILINE - 否则,只有整个文件,并且仅当您没有指定 re.DOTALL 时它没有换行符;-)。
我不明白你为什么需要一个正则表达式。 如果你想要的字符串以“.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 _"
【讨论】: