我正在尝试找到表达式,但我想要整个值,而不是单独的值:
test = "code.coding = 'DS-2002433E172062D';"
find = re.compile('[A-Z,\d]')
hey= re.findall(find,str(test))
print hey
response = ['D, 'S', '2', '0', '0', '2', '6', '6', '8', '0', '3', 'E', '1', '7', '2', '0', '6', '2', 'D']
但是我想要它作为DS-2002433E172062D
答案 0 :(得分:3)
您当前的正则表达式[A-Z,\d]
匹配A-Z范围内的单个字符或数字。您想要在匹配中捕获整个所需的字符串。试试:
import re
regx = r'[a-zA-Z]{2}-[a-zA-Z0-9]+'
print(re.findall(regx, "code.coding = 'DS-2002433E172062D';"))
输出:
['DS-2002433E172062D']
说明:
[ // start of single character match
a-zA-Z0-9 // matches any letter or digit
]{2} // matches 2 times
- // matches the - character
[ // start of single character match
a-zA-Z0-9 // matches any letter or digit
]+ // matches between 1 and unlimited times (greedy)
答案 1 :(得分:0)
作为对前一个答案的改进,我经常使用这样的效用函数:
def extractRegexPattern(theInputPattern, theInputString):
"""
Extracts the given regex pattern.
Param theInputPattern - the pattern to extract.
Param theInputString - a String to extract from.
"""
import re
sourceStr = str(theInputString)
prog = re.compile(theInputPattern)
theList = prog.findall(sourceStr)
return theList
test = "code.coding = 'DS-2002433E172062D';"
groups = extractRegexPattern("([A-Z,\d]+)+", test)
print(groups)
['DS', '2002433E172062D']
()
才能使其成为一个群组:你有:
'[A-Z,\d]'
这意味着:A-Z
或“,”(逗号)或模式\d
(数字)范围内的任何字母作为单个匹配...这会分别产生所有匹配(并巧妙地省略了需要[-A-Z,\d]
包含的破折号。
对于相同类型匹配的群组,请尝试:
'([A-Z,\d]+)+'
表示:每组匹配一次或多次A-Z
或“,”(逗号)或模式\d
(数字)范围内的任何字母,以及一个或多个预输入组。 。这会将所有匹配产生为组(并且明显省略了需要包含([A-Z,\d]+)+
的破折号。)
要点:使用()
(括号)来表示正则表达式中的组。
最后,在测试你的正则表达式时,使用像http://pythex.org这样的调试器可能会有所帮助,直到你掌握了模式的悬念。
抱歉,我错过了关于你想要它的部分DS-2002433E172062D
对于使用组的结果,请尝试:
'([-A-Z,\d]+)+'
这意味着:-
(短划线)或A-Z
或,
(逗号)或模式\d
(数字)范围内的任何字母一次或多次每组匹配和一个或多个组预输入...这将产生所有匹配作为组。注意-
(短划线)必须在大多数(全部?)正则表达式中的任何范围之前,并且根据我的经验,最好将破折号作为模式的开头,以便清楚。
希望这有帮助
答案 2 :(得分:0)
你离我很近,只是改变你的正则表达式:
pattern=r'[A-Z,\d]'
到
pattern=r'[A-Z,\d-]+'
完整代码:
import re
test = "code.coding = 'DS-2002433E172062D';"
pattern=r'[A-Z,\d-]+'
print(re.findall(pattern,test))
输出:
['DS-2002433E172062D']