首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用python或bash在多行文件中查找和替换模式

使用python或bash在多行文件中查找和替换模式
EN

Stack Overflow用户
提问于 2018-07-28 03:32:34
回答 2查看 62关注 0票数 0

我有一个这样的文本:

代码语言:javascript
复制
   \/::360::__/
    |::559:::|  |
 ::468::\:\~\:\ \/__/
 /:/\:\  /::390::\__\
::138::
  ::380::  /:/  \/__/
     /::144::\  \
    /::\ ::145:: \
::418::      ___
      ::539::___
     \|::483::__|

这里使用\|_制作了一些模式。每一行都以::539::等格式添加到某个随机位置中的行号。我想首先根据给定的行号对所有行进行排序,然后从每行中剔除**::line-number::**以获得实际的标志。

(实际问题有600行,随机排列。需要对它们进行适当的剥离才能找到旗帜。)

The actual complete text file link

我已经发布了我使用的python代码,如下所示。

代码语言:javascript
复制
#!/usr/bin/python3
# import sys
with open( 'sorted.txt'  ) as file:
    randlst =[0] * 600
    for line in file:
        num=''
        strng=''
        for each in line:
            if each.isdigit():
                num += each
            else:
                strng += each
        strng = strng.strip('::::')
        num = int(num)
        randlst.insert(num,strng)
    for i in range(600):
        if randlst[i] !=0:
            print(str(randlst[i]).replace('::::',''))

在这段代码中,文件sorted.txt是在使用bash对实际输入文件(在上面的链接中给出)进行排序后生成的,因为我认为在python中进行排序会变得很困难。

问题是bash所做的排序并不完全准确,正如您在这里看到的:

代码语言:javascript
复制
      ::0:: ___
    ::1:: /\__\
     \/__::10::/
     /\  \::100::
    /::\ ::101:: \
   ::102::/:/\:\  \
  /:/  \:\::103::  \

由于这个看似很小的错误,最终的输出没有几个字母,我的提交被拒绝了。

请指出我如何改进这一点(我不了解正则表达式,很抱歉这是一个糟糕的脚本)。

或者,您是否可以建议使用bash命令来完成此工作,而不是使用python?

EN

回答 2

Stack Overflow用户

发布于 2018-07-28 04:02:41

这将根据编号对行进行排序,并将它们写入标准输出(将用::<number>::替换''):

代码语言:javascript
复制
data = r"""   \/::360::__/
    |::559:::|  |
 ::468::\:\~\:\ \/__/
 /:/\:\  /::390::\__\
::138::
  ::380::  /:/  \/__/
     /::144::\  \
    /::\ ::145:: \
::418::      ___
      ::539::___
     \|::483::__|"""


import re
for s1, _, s2 in sorted(re.findall(r'^(.*?)(?:::)(\d+)(?:::)(.*?)$', data, flags=re.M), key=lambda v: int(v[1])):
    print(s1 + s2)

打印:

代码语言:javascript
复制
     /\  \
    /::\  \
   \/__/
    /:/  \/__/
 /:/\:\  /\__\
      ___
 \:\~\:\ \/__/
     \|__|
      ___
    |:|  |
票数 -1
EN

Stack Overflow用户

发布于 2018-07-28 04:12:42

下面是一个python解决方案,它根据嵌入的行号对行进行排序,然后剥离这些行号并打印模式

代码语言:javascript
复制
>>> print(s)
   \/::360::__/ 
    |::559:::|  | 
 ::468::\:\~\:\ \/__/ 
 /:/\:\  /::390::\__\ 
::138:: 
  ::380::  /:/  \/__/ 
     /::144::\  \ 
    /::\ ::145:: \ 
::418::      ___ 
      ::539::___ 
     \|::483::__| 
>>> 
>>> 
>>> sorted_s ='\n'.join(sorted(s.splitlines(), key=lambda x: int(re.findall(r'\d+', x)[0])))
>>> print (re.sub(r'::\d+::', '', sorted_s))

     /\  \ 
    /::\  \ 
   \/__/ 
    /:/  \/__/ 
 /:/\:\  /\__\ 
      ___ 
 \:\~\:\ \/__/ 
     \|__| 
      ___ 
    |:|  | 
>>> 

在用户G_M创建的https://bpaste.net/raw/5379781c4ee8页面的内容上尝试此操作后,我们将得到以下结果

代码语言:javascript
复制
>>> import requests
>>> import re
>>> 
>>> r = requests.get('https://bpaste.net/raw/5379781c4ee8')
>>> s = r.text
>>> sorted_s ='\n'.join(sorted(s.splitlines(), key=lambda x: int(re.findall(r'\d+', x)[0])))
>>> print (re.sub(r'::\d+::', '', sorted_s))
      ___
     /\__\
    /::|  |
   /:|:|  |
  /:/|:|__|__
 /:/ |::::\__\
 \/__/~~/:/  /
       /:/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\__\
    /:/  /
   /:/__/
  /::\__\____
 /:/\:::::\__\
 \/_|:|~~|~
    |:|  |
    |:|  |
    |:|  |
     \|__|

      ___
     /\  \
     \:\  \
     /::\__\
  __/:/\/__/
 /\/:/  /
 \::/__/
  \:\__\
   \/__/

      ___
     /\__\
    /::|  |
   /:|:|  |
  /:/|:|  |__
 /:/ |:| /\__\
 \/__|:|/:/  /
     |:/:/  /
     |::/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/_\:\__\
 \:\  /\ \/__/
  \:\ \:\__\
   \:\/:/  /
    \::/  /
     \/__/











      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\ \  \
  _\:\~\ \  \
 /\ \:\ \ \__\
 \:\ \:\ \/__/
  \:\ \:\__\
   \:\/:/  /
    \::/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/ \:\__\
 \:\  \  \/__/
  \:\  \
   \:\  \
    \:\__\
     \/__/

      ___
     /\  \
     \:\  \
     /::\__\
  __/:/\/__/
 /\/:/  /
 \::/__/
  \:\__\
   \/__/


      ___
     /\  \
     \:\  \
     /::\__\
  __/:/\/__/
 /\/:/  /
 \::/__/
  \:\__\
   \/__/












      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/_|::\/:/  /
    |:|::/  /
    |:|\/__/
    |:|  |
     \|__|
      ___
     /\  \
     \:\  \
      \:\  \
      /::\  \
     /:/\:\__\
    /:/  \/__/
   /:/  /
   \/__/














      ___
     /\  \
     \:\  \
     /::\__\
  __/:/\/__/
 /\/:/  /
 \::/__/
  \:\__\
   \/__/

      ___
     /\  \
    /::\  \
   /:/\ \  \
  _\:\~\ \  \
 /\ \:\ \ \__\
 \:\ \:\ \/__/
  \:\ \:\__\
   \:\/:/  /
    \::/  /
     \/__/











      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/











      ___
     /\__\
    /:/  /
   /:/__/
  /::\__\____
 /:/\:::::\__\
 \/_|:|~~|~
    |:|  |
    |:|  |
    |:|  |
     \|__|
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \:\~\:\ \/__/
  \:\ \:\__\
   \:\ \/__/
    \:\__\
     \/__/
      ___
     |\__\
     |:|  |
     |:|  |
     |:|__|__
     /::::\__\
    /:/~~/~
   /:/  /
   \/__/













      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
       \/__/


      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/_|::\/:/  /
    |:|::/  /
    |:|\/__/
    |:|  |
     \|__|
      ___
     /\  \
     \:\  \
      \:\  \
      /::\  \
     /:/\:\__\
    /:/  \/__/
   /:/  /
   \/__/













      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/ \:\__\
 \:\  \ /:/  /
  \:\  /:/  /
   \:\/:/  /
    \::/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\ \/__/
      \:\__\
       \/__/













      ___
     /\  \
     \:\  \
      \:\  \
      /::\  \
     /:/\:\__\
    /:/  \/__/
   /:/  /
   \/__/


      ___
     /\__\
    /:/  /
   /:/__/
  /::\  \ ___
 /:/\:\  /\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \:\~\:\ \/__/
  \:\ \:\__\
   \:\ \/__/
    \:\__\
     \/__/











      ___
     /\__\
    /:/  /
   /:/__/
  /::\  \ ___
 /:/\:\  /\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/ \:\__\
 \:\  \  \/__/
  \:\  \
   \:\  \
    \:\__\
     \/__/
      ___
     /\__\
    /:/  /
   /:/__/
  /::\__\____
 /:/\:::::\__\
 \/_|:|~~|~
    |:|  |
    |:|  |
    |:|  |
     \|__|
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \:\~\:\ \/__/
  \:\ \:\__\
   \:\ \/__/
    \:\__\
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/_|::\/:/  /
    |:|::/  /
    |:|\/__/
    |:|  |
     \|__|
      ___
     /\  \
    /::\  \
   /:/\ \  \
  _\:\~\ \  \
 /\ \:\ \ \__\
 \:\ \:\ \/__/
  \:\ \:\__\
   \:\/:/  /
    \::/  /
     \/__/











      ___
     /\  \
     \:\  \
      \:\  \
      /::\  \
     /:/\:\__\
    /:/  \/__/
   /:/  /
   \/__/


      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/ \:\__\
 \:\  \ /:/  /
  \:\  /:/  /
   \:\/:/  /
    \::/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/ \:\__\
 \:\  \ /:/  /
  \:\  /:/  /
   \:\/:/  /
    \::/  /
     \/__/
      ___
     /\__\
    /:/  /
   /:/  /
  /:/  /
 /:/__/
 \:\  \
  \:\  \
   \:\  \
    \:\__\
     \/__/
      ___
     /\__\
    /:/  /
   /:/__/
  /::\__\____
 /:/\:::::\__\
 \/_|:|~~|~
    |:|  |
    |:|  |
    |:|  |
     \|__|

      ___
     /\  \
     \:\  \
     /::\__\
  __/:/\/__/
 /\/:/  /
 \::/__/
  \:\__\
   \/__/

      ___
     /\  \
     \:\  \
      \:\  \
      /::\  \
     /:/\:\__\
    /:/  \/__/
   /:/  /
   \/__/
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51564448

复制
相关文章

相似问题

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