请尝试匹配文件中的以下字符串:
test/test/abc_xyz[2][0]/abc
test/test/abc_xyz[2]/abc
test/test/abc_xyz/abc
我在TCL脚本中使用regexp尝试了以下操作:
set match [regexp {^.*\/*\_xyz(|\[[0-9]{1,}\]|\[[0-9]{1,}\]\[[0-9]{1,}\])\/abc} $line extracted_string ]
使用这个正则表达式我设法提取这些行:
"test/test/abc_xyz[2]/abc"
"test/test/abc_xyz/abc"
但无论如何都无法提取类似于此的行:
test/test/abc_xyz[2][0]/abc
有人可以告诉我,我可能缺少什么吗?
答案 0 :(得分:0)
在这种情况下,你有这个序列 - [
,digit(s),]
- 你想要匹配零次或多次。这导致:(?:\[\d+\])*
作为一般RE。使用它来代替更复杂的部分,我们可以得到:
set match [regexp {^.*\/*\_xyz((?:\[\d+\])*)\/abc} $line extracted_string substring ]
这个更短,很多更容易理解。我还在那里添加了substring
以获得括号中的序列。使用明智的string map
空格括号来处理这个问题最好:
set numbers [string map {"[" " " "]" " "} $substring]
现在您可以使用列表操作(llength
,lindex
,foreach
等)...
答案 1 :(得分:-1)
试试这个:更新^.*\/*\_xyz(\[\d+\])?\/abc
<强>解释强>
你的问题在(|\[[0-9]{1,}\]|\[[0-9]{1,}\]\[[0-9]{1,}\])
阻止。
我想你想[05]
之后xyz
和/abc
在(\[\d+\])
之前
[05]
的 ?
colObj = College.objects.get(id=1)
name = "collegeName"
colName = getattr(colObj, name)
一次或多次
它可能有帮助。的 demo 强>