如何使用正则表达式从字符串的开头开始捕获另一种模式,从字符串的末尾捕获另一种模式?

问题描述 投票:1回答:1

我需要捕获两个不同的模式,一个从字符串的开头,另一个从结尾。

我正在使用Python3。

示例1:

string: 'TRADE ACCOUNT BALANCE FROM 2 TRADE LINES CALL. .... $ 23,700'
expected_output: TRADE ACCOUNT BALANCE 23,700
my_regex_pattern: r'(TRADE ACCOUNT BALANCE).+([\d,]+)'
output(group 0): TRADE ACCOUNT BALANCE
output(group 1): 0

示例2:

string: 'AVERAGE BALANCE IN THE PAST 5 QUARTERS ......... $ 26,460'
output: AVERAGE BALANCE 26,460
my_regex_pattern: r'(AVERAGE BALANCE).+([\d,]+)'
output(group 0): AVERAGE BALANCE
output(group 1): 0

子字符串最后总是一个数字。开头的子字符串始终是一个单词我不明白为什么它只捕获结尾的最后一个字符。

regex python-3.7 regex-group
1个回答
2
投票

您模式中的.+将整个字符串匹配到末尾,然后回溯以查找与[\d,]+模式匹配的第一个匹配项。由于最后一个0符合此条件,因此第二组中的匹配仅以0成功。

在这种情况下,您需要做的是找到“锚定”第二组起点的位置。

您提供的字符串中,数字前有一个美元符号。因此,您可以使用

(TRADE ACCOUNT BALANCE).*\$\s*(\d[\d,]*)

请参见regex demoregex graph

enter image description here

详细信息

  • [(TRADE ACCOUNT BALANCE)-组1:文字子串
  • .*-尽可能多的除换行符以外的0+个字符
  • [\$-一个$字符
  • \s*-0+空格
  • (\d[\d,]*)-第2组:一个数字,然后是0+个数字或逗号。

-1
投票

这是一个使用JavaScript的小型视觉测试,但我相信它在Python中是相同的。

const regex = /(TRADE ACCOUNT BALANCE)|(\d+\,\d+)/g

const text = "TRADE ACCOUNT BALANCE FROM 2 TRADE LINES CALL. .... $ 23,700"


const res = text.match(regex)

console.log(res)

您可以尝试使用此正则表达式:

/(TRADE ACCOUNT BALANCE)|(\d+\,\d+)/g

匹配:

Match 1
Full match  0-21    TRADE ACCOUNT BALANCE
Group 1.    0-21    TRADE ACCOUNT BALANCE
Match 2
Full match  54-60   23,700
Group 2.    54-60   23,700
© www.soinside.com 2019 - 2024. All rights reserved.