为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2022-07-12 15:16:22
我有一些数据(如下)正在尝试对齐。| 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 为这个数据修改任务做实际的正则表达式替换/添加。
查看完整描述

2 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

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

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

我在第 1 组中保留了 506 之前的所有内容,在第 2 组中保留了 506 之后的所有内容,并添加了一个“|” 介于两者之间。


查看完整回答
反对 回复 2022-07-12
?
aluckdog

TA贡献1847条经验 获得超7个赞

您的正则表达式存在一些问题。星号*表示前一个元素(无论是一个字符还是复合词)可以重复零次或多次。因此,\|*将匹配“”(空字符串)、“|”、“||”等,\|*\|*\|\|并将匹配两个连续的条“||” 前面有任意数量的小节(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|

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


查看完整回答
反对 回复 2022-07-12
  • 2 回答
  • 0 关注
  • 689 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号