Py学习  »  Python

在Python中隔离给定结构的所有子字符串

Just some Guy • 3 年前 • 1382 次点击  

我目前正试图编写一个程序,通过一个网站生成的聊天日志进行在线TTRPG播放。目前,我的输出如下:

滚动7d10(1+4+5+3+8+8+3)=32滚动7d10(6+8+3+9+7+10+8)=51滚动7d10(7+7+6+6+8+3+5)=42滚动4d10(3+3+3+4)=13滚动7d10(5+5+10+7+4+9+10)=50滚动1d10+8(10+8=18

我希望这个的每个子串都作为一个独立的字符串给出。在这种情况下,“子字符串”将是结构后面的任何内容

滚动xdy(1+2+3…+z)=a

我很确定我需要一个正则表达式来做这件事,但这看起来是什么样子(我承认我对正则表达式不是很在行)我无法理解。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129811
 
1382 次点击  
文章 [ 3 ]  |  最新文章 3 年前
obiwanmikenolte
Reply   •   1 楼
obiwanmikenolte    3 年前

最好让记录者在每次输入后放置一个行终止符,但这会让你从你华丽的D10钱包中获得一系列卷。

import re

log_contents = 'rolling 7d10(1+4+5+3+8+8+3)=32rolling 7d10(6+8+3+9+7+10+8)=51rolling 7d10(7+7+6+6+8+3+5)=42rolling 4d10(3+3+3+4)=13rolling 7d10(5+5+10+7+4+9+10)=50rolling 1d10 + 8(10)+8=18'

pattern = re.compile('(=[0-9]*)')
rolls = pattern.sub(r'\1\n', log_contents).rstrip().split('\n')
Eugenij
Reply   •   2 楼
Eugenij    3 年前

你可以不用这样的正则表达式来解决你的任务

data = "rolling 7d10(1+4+5+3+8+8+3)=32rolling 7d10(6+8+3+9+7+10+8)=51rolling 7d10(7+7+6+6+8+3+5)=42rolling 4d10(3+3+3+4)=13rolling 7d10(5+5+10+7+4+9+10)=50rolling 1d10 + 8(10)+8=18"

parts = data.split("rolling")[1:]
print(parts)
# [' 7d10(1+4+5+3+8+8+3)=32', ' 7d10(6+8+3+9+7+10+8)=51', ' 7d10(7+7+6+6+8+3+5)=42', ' 4d10(3+3+3+4)=13', ' 7d10(5+5+10+7+4+9+10)=50', ' 1d10 + 8(10)+8=18']

如果你需要的话,你可以系上绳子 rolling 回到零件

parts = ["rolling" + p for p in parts]
print(parts)
# ['rolling 7d10(1+4+5+3+8+8+3)=32', 'rolling 7d10(6+8+3+9+7+10+8)=51', 'rolling 7d10(7+7+6+6+8+3+5)=42', 'rolling 4d10(3+3+3+4)=13', 'rolling 7d10(5+5+10+7+4+9+10)=50', 'rolling 1d10 + 8(10)+8=18']
azro
Reply   •   3 楼
azro    3 年前

从你共享的结构来看 rolling xdy(1+2+3...+z)=a 将表示数字的everyletter替换为 \d+ (一个或多个数字)并进行一些调整,您将获得

rolling \d+d\d+\((?:\d+\+)*\d+\)=\d+

Regex demo


import re

text = "rolling 7d10(1+4+5+3+8+8+3)=32rolling 7d10(6+8+3+9+7+10+8)=51rolling " \
       "7d10(7+7+6+6+8+3+5)=42rolling 4d10(3+3+3+4)=13rolling " \
       "7d10(5+5+10+7+4+9+10)=50rolling 1d10 + 8(10)+8=18"
results = re.findall(r"rolling \d+d\d+\((?:\d+\+)*\d+\)=\d+", text)
print(results)
['rolling 7d10(1+4+5+3+8+8+3)=32', 'rolling 7d10(6+8+3+9+7+10+8)=51', 
 'rolling 7d10(7+7+6+6+8+3+5)=42', 'rolling 4d10(3+3+3+4)=13', 
 'rolling 7d10(5+5+10+7+4+9+10)=50']

请注意,最后一个是无效的,因为有数字和数字 + 在括号外签名