我正在尝试从 python 正则表达式解析字符串 - 当字符串包含“:”时无法解析
I am trying to parse string from python regex-Not able parse when string contain ":"
我有
string = ":61:2002190219C45612.4S202EXCOL3654628815//CT56748005:86:/BENM/Unitech Imports/REM//58970.047:61:2002190219C30000S103LCADV5674920204//CT56748006:86:/BENM/Gravity Imports/REM//INV/FEB20/446301"
pattern = "61:[A-Za-z0-9 \/,\-_\.]{1,}:86:[A-Za-z0-9 \/\.\-]{1,}"
re.findall(pattern , string) # - > this is giving list with 2 element
但是当字符串中有 ":" 时,我将正则表达式修改为 "61:[A-Za-z0-9 \/,\-_\.:]{1,}:86:[A-Za-z0-9 \/\.\-:]{1,}"
,然后它在一个列表中给出了完整的内容。
modified_string = ":61:2002190219C45612.4S202EXCOL:3654628815//CT56748005:86:/BENM/Unitech Imports/REM//58970.047:61:2002190219C30000S103LCAD:V5674920204//CT56748006:86:/BENM/Gravity Imports/REM//INV/FEB20/446301"
我尝试了多个选项,但无法获得所需的输出。
预计o/p
re.findall(pattern,modified_string)
# => ['61:2002190219C45612.4S202EXCOL:3654628815//CT56748005:86:/BENM/Unitech Imports/REM//58970.047','61:2002190219C30000S103LCAD:V5674920204//CT56748006:86:/BENM/Gravity Imports/REM//INV/FEB20/446301' ]
冒号似乎是您到达匹配结尾的唯一指示符,因此允许冒号成为匹配的一部分会删除您的分隔符。也就是说,您可以通过将量词 {1,}
更改为非 greedy(即 return 最短匹配而不是最长的)。一般来说,这是一个有点老套的解决方案,表明您可能需要重新考虑您的解析策略。但是如果你在每个 {1,}
之后添加一个 ?
,你会再次得到两个匹配项。
此外,您可以将 {1,}
缩短为 +
。
pattern = re.compile(r"61:[A-Za-z0-9 \/,\-_\.:]+?:86:[A-Za-z0-9 \/\.\-:]+?")
pattern.findall(string)
#=> ['61:2002190219C45612.4S202EXCOL3654628815//CT56748005:86:/',
'61:2002190219C30000S103LCADV5674920204//CT56748006:86:/']
由于模式以 61:
开头并且出现了一次 :81:
,您可以使用交替来匹配字符 class [= 中列出的任何字符13=] 或仅匹配 :
时不直接跟在 61:
或 86:
使用否定前瞻。
61:(?:[\w /,.-]|:(?!61:|86:))*:86:(?:[A-Za-z0-9 /.-]|:(?!61:|86:))*
我有
string = ":61:2002190219C45612.4S202EXCOL3654628815//CT56748005:86:/BENM/Unitech Imports/REM//58970.047:61:2002190219C30000S103LCADV5674920204//CT56748006:86:/BENM/Gravity Imports/REM//INV/FEB20/446301"
pattern = "61:[A-Za-z0-9 \/,\-_\.]{1,}:86:[A-Za-z0-9 \/\.\-]{1,}"
re.findall(pattern , string) # - > this is giving list with 2 element
但是当字符串中有 ":" 时,我将正则表达式修改为 "61:[A-Za-z0-9 \/,\-_\.:]{1,}:86:[A-Za-z0-9 \/\.\-:]{1,}"
,然后它在一个列表中给出了完整的内容。
modified_string = ":61:2002190219C45612.4S202EXCOL:3654628815//CT56748005:86:/BENM/Unitech Imports/REM//58970.047:61:2002190219C30000S103LCAD:V5674920204//CT56748006:86:/BENM/Gravity Imports/REM//INV/FEB20/446301"
我尝试了多个选项,但无法获得所需的输出。
预计o/p
re.findall(pattern,modified_string)
# => ['61:2002190219C45612.4S202EXCOL:3654628815//CT56748005:86:/BENM/Unitech Imports/REM//58970.047','61:2002190219C30000S103LCAD:V5674920204//CT56748006:86:/BENM/Gravity Imports/REM//INV/FEB20/446301' ]
冒号似乎是您到达匹配结尾的唯一指示符,因此允许冒号成为匹配的一部分会删除您的分隔符。也就是说,您可以通过将量词 {1,}
更改为非 greedy(即 return 最短匹配而不是最长的)。一般来说,这是一个有点老套的解决方案,表明您可能需要重新考虑您的解析策略。但是如果你在每个 {1,}
之后添加一个 ?
,你会再次得到两个匹配项。
此外,您可以将 {1,}
缩短为 +
。
pattern = re.compile(r"61:[A-Za-z0-9 \/,\-_\.:]+?:86:[A-Za-z0-9 \/\.\-:]+?")
pattern.findall(string)
#=> ['61:2002190219C45612.4S202EXCOL3654628815//CT56748005:86:/',
'61:2002190219C30000S103LCADV5674920204//CT56748006:86:/']
由于模式以 61:
开头并且出现了一次 :81:
,您可以使用交替来匹配字符 class [= 中列出的任何字符13=] 或仅匹配 :
时不直接跟在 61:
或 86:
使用否定前瞻。
61:(?:[\w /,.-]|:(?!61:|86:))*:86:(?:[A-Za-z0-9 /.-]|:(?!61:|86:))*