繁体   English   中英

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

[英]How to add character to beginning of regex matched string?

我有一些我正在尝试对齐的数据(如下)。

| 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)

刚刚开始使用正则表达式,因此感谢您的任何帮助!

PS - 我正在使用 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|

该解决方案查找其间具有正数项的条,这些条不是条。 [^|]表示除|任何内容会匹配。 请注意,在括号中,该栏不需要转义。 +表示“一个或多个前一个元素”。

这对你有用吗? 它给了我想要的输出。

re.sub(r'(\|.*\|.*\|.*)(\|.*\|.*\|\|\n)',r'\g<1>'+'|'+r'\g<2>',DATA)

我将 506 之前的所有内容保留在第 1 组中,并将其后的所有内容保留在第 2 组中,并添加了“|” 之间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM