如何在正则表达式匹配的字符串开头添加字符?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在正则表达式匹配的字符串开头添加字符?相关的知识,希望对你有一定的参考价值。

我有一些要对齐的数据(下)。

| 24 | 11 | 506  | -1  | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|

[每当倒数第二个值似乎为负时,该行就会遗漏“ |”定界符。我正在尝试使用正则表达式在记录的中间添加垂直条,以重新对齐数据,如下所示:

| 24 | 11 |      | 506 | -1     | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99 | 3|
| 12 | 11 | 1933 | 531 | 2      | 7.78   | N|

忽略空白,出于这个问题的目的,我将其包括在内以使数据更具可读性。

我知道下面的表达式将找到正确的文本组并放置一个附加的“ |”在它之后,但是可以对其进行修改以放入“ |”在小组之前?

re.sub(r'(\|*\|*\|\|)', r'\1',DATA)

刚开始使用正则表达式,所以可以得到任何帮助!

P.S。 -我正在使用python进行此数据处理任务的实际正则表达式替换/添加。

答案

您的正则表达式中存在一些问题。星号*表示前一个元素(一个字符或复合字符)可以重复零次或多次。因此,\|*将匹配“”(空字符串),“ |”,“ ||”等,而\|*\|*\|\|将匹配两个连续的小节“ ||”前面带有任意数量的小节(0或更多)-因此,它仅与最后两个小节匹配。

[为了证明这一点,您可以使用re.sub,用一些不同的字符包围后向引用(即\1)(我在下面用大括号,即\1)。

data="""| 24 | 11 | 506  | -1  | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|
"""
print("using regex above, with curly braces around captured match:")
print(re.sub(r'(\|*\|*\|\|)', r'\1', data))

print("desired output:")
print(re.sub(r'(\|[^|]+\|[^|]+\|[^|]+\|\|)', r'|\1', data))

输出:

using regex above, with curly braces around captured match:
| 24 | 11 | 506  | -1  | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|

desired output:
| 24 | 11 || 506  | -1  | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|

该解决方案会寻找在它们之间有正数个项目的条,而不是条。 [^|]表示将匹配|以外的任何内容。请注意,在括号中,该栏不需要转义。 +表示“上一个元素中的一个或多个”。

以上是关于如何在正则表达式匹配的字符串开头添加字符?的主要内容,如果未能解决你的问题,请参考以下文章

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

如何编写正则表达式模式以匹配字符串结尾或字符串开头的货币符号

正则表达式匹配以某个字符串开头的后面部分的字符串