首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python正则表达式在文件中查找、编辑和替换

python正则表达式在文件中查找、编辑和替换
EN

Stack Overflow用户
提问于 2016-01-08 04:16:35
回答 1查看 262关注 0票数 0

我有一个文本文件(bio.txt),其中包含以下文本:

代码语言:javascript
复制
Enter for a chance to {win|earn|gain|obtain|succeed|acquire|get} 
1 - Click {Link|Url|Link up|Site|Web link} Below
2 - Enter Name
3 - Do the submit(inside option {put|have|positioned|set|placed|apply|insert} address)

我有这段python代码:

代码语言:javascript
复制
def spyntax():
    bio_file = open('bio.txt', 'r').readlines()
    _line = ''
    for line in bio_file:
        try:
            matches = re.findall('\{([a-zA-Z| ]+)\}', line)
            for march in matches:
                tmp = random.choice(march.split('|'))
            _line += re.sub('\{([a-zA-Z| ]+)\}', tmp, line)
        except Exception as e:
            print e
    return _line

代码查找文本的方式如下:

代码语言:javascript
复制
{win|earn|gain|obtain|succeed|acquire|get}  

并替换为随机选择的文本组。问题是,如果在同一行中存在更多具有

代码语言:javascript
复制
{text|text} {word1|word2}

那么python不会替换正确的{}。如何让此代码正确替换所有{}组?

EN

回答 1

Stack Overflow用户

发布于 2016-01-08 04:35:51

您可以将re.sub()与一个小帮助器函数相结合,从结果中选择一个随机字符串并将其用于sub:

代码语言:javascript
复制
import re
import random

s = "Enter for a chance to {win|earn|gain|obtain|succeed|acquire|get}"

def split_rand(r):
    r = r.group(1)
    return random.choice(r.split('|'))

print re.sub('{(.*?)}', lambda r: split_rand(r), s)

如果你想得到更多的最小化,你可以删除这个函数,然后简单地:

代码语言:javascript
复制
re.sub('{(.*?)}', lambda r: random.choice(r.group(1).split('|')), s)

因此,您可以将循环重新编写到程序中,以:

代码语言:javascript
复制
for line in biofile:
    _line += re.sub('{(.*?)}', lambda r: random.choice(r.group(1).split('|')), line)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34664354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档