我正在尝试编写一个正则表达式来匹配文件中的库和包含该文件的路径。文件中的所有库都将采用格式。
text = "mylib|C://desktop//baseicmylib.lib
randlib|C://desktop//randlib.lib"
所以,如果我想找到mylib
我写了
str = "mylib"
pattern = r'%s\\|.*lib'%str
mypath = re.findall(pattern,text)
在我犯错误的地方,有人可以帮助我。
答案 0 :(得分: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'}
答案 1 :(得分:1)
管道之前的//导致问题。 以下对我来说很好:
text = "argh|foo.lib"
str = "argh"
pattern = r"%s\|.*lib" %str
print re.findall(pattern,text)
['argh', '|hehe.lib']
//不用于转义,如果你想在一个原始字符串中转义一个\就足够了(对于一个非原始字符串,双倍\)
答案 2 :(得分:1)
需要稍微调整一下你的模式:
text = '''mylib|C://desktop//baseicmylib.lib
randlib|C://desktop//randlib.lib'''
str = 'mylib'
pattern = "%s\|(.+?\.lib)" %str
print re.findall(pattern,text)
答案 3 :(得分:0)
>>>pattern = r'%s.*?lib'%str
>>>re.findall(pattern, text)
['mylib|C://desktop//baseicmylib']
正则表达式中的no-greedy匹配
*?,+?,??
'*'
,'+'
和'?'
限定符都是贪婪的,它们匹配尽可能多的文本。有时这种行为是不可取的;如果RE<.*>
与'title'匹配,它将匹配整个字符串,而不仅仅是''。添加'?'在限定符之后,它以非贪婪或最小的方式执行匹配;尽可能少的字符将匹配。使用。*?在上一个表达式中只会匹配''。