将Regex Result作为组Python获取

时间:2018-03-29 23:58:38

标签: python regex

我正在尝试找到表达式,但我想要整个值,而不是单独的值:

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

3 个答案:

答案 0 :(得分:3)

您当前的正则表达式[A-Z,\d]匹配A-Z范围内的单个字符或数字。您想要在匹配中捕获整个所需的字符串。试试:

[a-zA-Z0-9]{2}-[a-zA-Z0-9]+

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)

作为对前一个答案的改进,我经常使用这样的效用函数:

Python函数:

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']