当前位置: 首页 > 知识库问答 >
问题:

重新格式化整数块的正则表达式(魔术方块)

詹唯
2023-03-14

我有一个包含魔法方块的大文件,以四个一组由空格分隔:

 2 16  1 15    10  5 12  7     9  3 14  8    13  6 11  4
14  9  8  3     3  9  8 14     5 10  7 12    12 10  7  5
11  4 13  6     6  4 13 11    16 15  2  1     1 15  2 16
 7  5 12 10    15 16  1  2     4  6 11 13     8  3 14  9

最终,我想找到并重新格式化这些组,使每个单独的幻方分别显示如下:

 2 16  1 15
14  9  8  3
11  4 13  6
 7  5 12 10

10  5 12  7
 3  9  8 14
 6  4 13 11
15 16  1  2

 9  3 14  8
 5 10  7 12
16 15  2  1
 4  6 11 13

13  6 11  4
12 10  7  5
 1 15  2 16
 8  3 14  9

首先,我有一个正则表达式,可以查找所有四个数字的组,但如果我指定每个整数前面有0-2个空格,这只给我需要的16个匹配项:

(( {0,2}\d{1,2}){4}).*?

(Regexr上保存的版本)

我只想在每一列的开始处捕捉整数前面的零或一个空格,而不是分隔16个块的四个空格。

然后我需要捕获四个整数的16个组中的每一个,并从捕获的组中重新格式化它们

\1\5\9\13\n\n

给予:

 2 16  1 15
14  9  8  3
11  4 13  6
 7  5 12 10

但到目前为止,我的正则表达式捕捉到了一切。如何将捕获组分开以实现这一点?

共有3个答案

臧梓
2023-03-14

regex似乎不是这份工作的好选择,但这是可能的。例如,要同时匹配所有四个正方形,并按您想要的顺序提取它们,可以使用这个长得离谱的正则表达式:

^((?:\s{0,2}\d+)+)\s+((?:\s{0,2}\d+)+)\s+((?:\s{0,2}\d+)+)\s+(.+)\n((?:\s{0,2}\d+)+)\s+((?:\s{0,2}\d+)+)\s+((?:\s{0,2}\d+)+)\s+(.+)\n((?:\s{0,2}\d+)+)\s+((?:\s{0,2}\d+)+)\s+((?:\s{0,2}\d+)+)\s+(.+)\n\s+((?:\s{0,2}\d+)+)\s+((?:\s{0,2}\d+)+)\s+((?:\s{0,2}\d+)+)\s+((?:\s{0,2}\d+)+)

演示

然后使用从1美元到16美元的所有组来获得正方形。然而,我不确定它是否以另一种方式比正则表达式练习有用。

柳镜
2023-03-14

我可以向你建议如下:

(( {0,2}?\d{1,2}){4}) +(( {0,2}?\d{1,2}){4}) +(( {0,2}?\d{1,2}){4}) +(( {0,2}?\d{1,2}){4})

你可以得到这样的结果:

$1

 2 16  1 15
14  9  8  3
11  4 13  6
 7  5 12 10

$3

10  5 12  7
3  9  8 14
6  4 13 11
15 16  1  2

$5
...

$7
...
申屠飞
2023-03-14

这是我的解决方案。我觉得效果不错。

squares = []
row_counter = 0
four = None
with open('magic-squares.txt') as f:
    for row in f:
        numbers = row.split()
        if numbers:
            if row_counter == 0:
                if four:
                    squares += four
                four = [[],[],[],[]]
            for i in range(4):
                four[i] += numbers[i*4:i*4+4]
            row_counter += 1
            row_counter %= 4

with open('output.txt', 'w') as f:
    f.write('\n'.join(' '.join(square) for square in squares))

with open('output2.txt', 'w') as f:
    f.write(
        '\n\n'.join(
            '\n'.join(
                ''.join(
                    ["{:<2} ".format(item) for item in square[i*4:(i+1)*4]]
                ) for i in range(4)
            ) for square in squares
        )
    )
 类似资料:
  • 问题内容: 我正在尝试编写一个正则表达式来检查给定的字符串是否像a + b,2 + a + b,3 + 6 * 9 + 6 * 5 + a * b等… 仅+和*运算符。 我试过了 不幸的是,它仅处理3 * 7 …(数字*数字)之类的情况。 等待您的答案,感谢您的阅读。 问题答案: 把和字符类中。 演示

  • 为什么要学正则表达式 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网站去搜索) 爬 (将所有的网站的内容全部爬下来) 取 (去掉对我们没用处的数据) 处理数据(按照我们想要的方式存储和使用) 我们在昨天的案例里实际上省略了第3步,也就是”取”的步骤。因为我们down下了的数据是全部的网页,这些数据很庞大并且很混乱,大部分的东西使我们不关心的,因此我们需要将之按我们的需要过

  • 问题内容: 我熟悉做pcre正则表达式,但是它们似乎并没有很快起作用。 验证数字1,000,000.00 但是,将其放在我的swift函数中会导致错误。 “乱抛垃圾序列无效” 这当然是因为pcre使用“ \”字符,该字符被迅速解释为转义符(我相信吗?) 因此,由于我不能只使用我习惯的正则表达式。如何将它们翻译为与Swift代码兼容? 问题答案: 在双引号中,单个反斜杠将被读取为转义序列。您需要再次

  • 在 Python 中,我们可以使用内置的 re 模块来使用正则表达式。 有一点需要特别注意的是,正则表达式使用 对特殊字符进行转义,比如,为了匹配字符串 ‘python.org’,我们需要使用正则表达式 'python.org',而 Python 的字符串本身也用 转义,所以上面的正则表达式在 Python 中应该写成 'python\.org',这会很容易陷入 的困扰中,因此,我们建议使用 Py

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?

  • 问题内容: 我问这个问题有点傻,但是从我读过的所有内容来看,这应该有效,但对我而言却无效。我只是想使用正则表达式匹配字符串中的整个单词。 因此,如果我试图在句子中找到单词“ the”,则对于“褐狐快速越过懒狗”应该返回true,而对于“褐狐快速越过懒狗”则返回false。 。 我已经试过了: 我也尝试过: 我也尝试过此正则表达式:“ \ bthe \ b” 而且它们总是返回false。我觉得我在这