我想把一个看起来像这样的字符串转换成:
ABC12DEF3G56HIJ7
进入
12 * ABC
3 * DEF
56 * G
7 * HIJ
我想使用正则表达式匹配构建正确的循环集。问题的关键在于代码必须完全通用,因为我不能假设 [A-Z]
片段的长度或者 [0-9]
片段的长度。
Python的re.findall
应该适合您的需求。
import re
s = "ABC12DEF3G56HIJ7"
pattern = re.compile(r'([A-Z]+)([0-9]+)')
for (letters, numbers) in re.findall(pattern, s):
print(numbers, '*', letters)
如果您的数据集很大,最好使用re.finditer
,因为它可以减少内存消耗(findall()
返回所有结果的列表,finditer()
逐个查找它们)。
import re
s = "ABC12DEF3G56HIJ7"
pattern = re.compile(r'([A-Z]+)([0-9]+)')
for m in re.finditer(pattern, s):
print m.group(2), '*', m.group(1)
print m.group(2), '*', m.group(1)
才能符合 OP 的期望输出。 我相信 m.group(0)
是“完整”的匹配——即 ABC12、DEF3、G56、HIJ7。 - DaveL17findall
获取所有结果,finditer
逐个获取。 - Mithrilprint(re.sub(r"([A-Z]+)(\d+)", r'\2 * \1\n', s))
re.sub()
从捕获的组中创建所需的字符串:import re
s = 'ABC12DEF3G56HIJ7'
for x in re.sub(r"([A-Z]+)(\d+)", r'\2 * \1,', s).rstrip(',').split(','):
print(x)
12 * ABC
3 * DEF
56 * G
7 * HIJ
''.join("%s * %s\n" % (n, w) for w, n in re.findall(r'(?i)([a-z]+)(\d+)', input_string))
- jfs