python - 原子捕获组的逆
问题描述
在一个序列中,我想获得多个字符的位置,然后是这些字符之间的字符和位置。
例如,在 中,我首先匹配并使用原子捕获条件的ABZYZABZAYAYABCYZA
所有倍数。Y
Z
import regex as re
seq = 'ABZYZABZAYAYABCYZA'
iter = re.finditer(r'Y|Z', seq)
dd = {}
for matchedobj in iter:
dd[matchedobj.group()] = dd.get(matchedobj.group(),[]) + [matchedobj.start()]
这使
{'Y': [3, 9, 11, 15], 'Z': [2, 4, 7, 16]}
然后我想匹配连续Y
或之间的所有整个空间Z
。在这种情况下,输出匹配应该是
{'AB': [0, 5], 'A': [8, 10], 'ABC':[12]}
尝试使用非捕获条件:
iter = re.findter(r'\w*?(?:(Y|Z))', seq)
并环顾四周:
iter = re.finditer(r'[^YZ]\w+?(?=Y|Z)|(?<=Y|Z)\w+?(?=Y|Z)|(?<=Y|Z)\w+', seq)
两者都不能正常工作。
解决方案
您的模式是X|Y
匹配单个字符X
或Y
. 要反转它,您可以使用[^XY]
并匹配任何 1+ 字符,您只需要附加+
量词即可。
现在,您将匹配项保存到字典中,但您希望键名相同。这意味着,只会保存每个相同键的最后一个值。您需要一个元组列表,而不是字典。
利用
for matchedobj in re.finditer(r'[^YZ]+', seq):
dd.append((matchedobj.group(), matchedobj.start()))
输出;[('AB', 0), ('AB', 5), ('A', 8), ('A', 10), ('ABC', 12), ('A', 17)]
推荐阅读
- python - TypeError:“播放器”对象不可调用 Django
- swift - Catalyst datePicker 显示系统时间而不是 utc 时间(datePicker 时区已设置为 UTC)
- wso2 - WSO2 API Manager 3.0 会话未注销发布者
- python - 分组熊猫数据框后索引消失
- python-3.x - TypeError:列表索引必须是整数或切片,而不是它在 if 语句中显示的 str
- python - 在 Heroku 上部署 Django 应用程序所需的支持
- python - 熊猫:无法进行位置索引
- kotlin - 在 git bash 中编译我的 Kotlin 测试
- java - 通过 junit 运行时,jooq 字段值为空
- flutter - 顶部有字母和数字的键盘(在 Flutter 中)