0

我正在尝试编写一个正则表达式来匹配文件中的库和包含该文件的路径。文件中的所有库都将采用该格式。

text = "mylib|C://desktop//baseicmylib.lib
        randlib|C://desktop//randlib.lib"

所以如果我想找到 mylib

我写

str = "mylib"
pattern = r'%s\\|.*lib'%str
mypath = re.findall(pattern,text)

有人可以帮助我在哪里犯错。

4

4 回答 4

3

也许不需要正则表达式?

text = '''mylib|C://desktop//baseicmylib.lib
    randlib|C://desktop//randlib.lib'''

libs = dict(line.split('|', 1) for line in
    (s.strip() for s in text.split('\n')))

结果:

{'randlib': 'C://desktop//randlib.lib',
   'mylib': 'C://desktop//baseicmylib.lib'}
于 2012-06-06T02:05:21.753 回答
1

管道之前的 // 导致问题。以下对我来说很好:

text = "argh|foo.lib"
str = "argh"
pattern = r"%s\|.*lib" %str
print re.findall(pattern,text)

['argh', '|hehe.lib']

// 不用于转义,如果您想在原始字符串中转义,则单个 \ 就足够了(对于非原始字符串,双 \ 就足够了)

于 2012-06-06T01:52:22.347 回答
1

需要稍微调整一下你的模式:

text = '''mylib|C://desktop//baseicmylib.lib
randlib|C://desktop//randlib.lib'''
str = 'mylib'
pattern = "%s\|(.+?\.lib)" %str
print re.findall(pattern,text)
于 2012-06-06T02:01:52.003 回答
0
>>>pattern = r'%s.*?lib'%str
>>>re.findall(pattern, text)
['mylib|C://desktop//baseicmylib']

这是正则表达式中的非贪婪匹配

*?, +?, ??

, , 和限定符都是贪婪的'*''+'它们'?'匹配尽可能多的文本。有时这种行为是不希望的;如果 RE<.*> 与 'title' 匹配,它将匹配整个字符串,而不仅仅是 ''。添加“?” 在预选赛使其以非贪婪或最低限度的方式执行比赛之后;将匹配尽可能少的字符。使用 。*?在前面的表达式中将只匹配 ''。

于 2012-06-06T02:06:45.397 回答