在Python中将两种模式与命名捕获组相结合?

时间:2016-02-16 15:14:10

标签: python regex

我有一个使用before模式的正则表达式,如下所示:

>>> RE_SID = re.compile(r'(?P<sid>(?<=sid:)([A-Za-z0-9]+))')
>>> x = RE_SID.search('sid:I118uailfriedx151201005423521">>')
>>> x.group('sid')
'I118uailfriedx151201005423521'

和另一个像这样:

>>> RE_SID = re.compile(r'(?P<sid>(?<=sid:<<")([A-Za-z0-9]+))')
>>> x = RE_SID.search('sid:<<"I118uailfriedx151201005423521')
>>> x.group('sid')
'I118uailfriedx151201005423521'

如何在解析这两个不同的行之后组合这两个模式:

sid:A111uancalual2626x151130185758596
sid:<<"I118uailfriedx151201005423521">>

只向我返回相应的ID。

3 个答案:

答案 0 :(得分:1)

RE_SID = re.compile(r'sid:(<<")?(?P<sid>([A-Za-z0-9]+))')

使用它,我刚刚测试过,它对我有用。我已经把一些东西搬了出去。

答案 1 :(得分:0)

除了调整正则表达式之外,只需删除除字母数字和冒号之外的任何字符,就可以更轻松地解析字符串。然后,只需按冒号拆分并获取最后一项:

>>> import re
>>> 
>>> test_strings = ['sid:I118uailfriedx151201005423521">>', 'sid:<<"I118uailfriedx151201005423521']
>>> pattern = re.compile(r"[^A-Za-z0-9:]")
>>> for test_string in test_strings:
...     print(pattern.sub("", test_string).split(":")[-1])
... 
I118uailfriedx151201005423521
I118uailfriedx151201005423521

答案 2 :(得分:0)

你可以用一个正则表达式实现你想要的东西:

\bsid:\W*(?P<sid>\w+)

请参阅regex demo

正则表达式分解:

  • \bsid - 全文sid
  • : - 字面冒号
  • \W* - 零个或多个非单词字符
  • (?P<sid>\w+) - 一个或多个单词字符捕获到名为“sid”的组中

Python demo

import re
p = re.compile(r'\bsid:\W*(?P<sid>\w+)')
#test_str = "sid:I118uailfriedx151201005423521\">>" # => I118uailfriedx151201005423521
test_str = "sid:<<\"I118uailfriedx151201005423521" # => I118uailfriedx151201005423521
m = p.search(test_str)
if m:
    print(m.group("sid"))