社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

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

我目前正试图编写一个程序,通过一个网站生成的聊天日志进行在线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
 
1252 次点击  
文章 [ 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']

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