首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >或在组之间,当一个组必须以字符为先导时。

或在组之间,当一个组必须以字符为先导时。
EN

Stack Overflow用户
提问于 2020-07-30 16:52:06
回答 3查看 63关注 0票数 0

我有以下数据:

代码语言:javascript
运行
复制
$200 – $4,500
Points – $2,500

我想以美元捕获范围,如果是较低的范围,则捕获Points字符串。

例如,如果我在上面的每个条目上运行正则表达式,我希望:

代码语言:javascript
运行
复制
Group 1: 200
Group 2: 4,500

代码语言:javascript
运行
复制
Group 1: Points
Group 2: 2,500

对于第一组,我无法理解如何只捕获整数值(没有$符号),同时允许捕获Points

以下是我尝试过的:

代码语言:javascript
运行
复制
(?:\$([0-9,]+)|Points) – \$([0-9,]+)

https://regex101.com/r/mD9JeR/1

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-30 16:57:05

只需在这里使用替换:

代码语言:javascript
运行
复制
^(?:(Points)|\$(\d{1,3}(?:,\d{3})*)) - \$(\d{1,3}(?:,\d{3})*)$

演示

上述regex模式的要点是,我们使用交替的方法来匹配范围低端的Points或美元金额,并使用以下正则表达式将美元金额与逗号匹配:

代码语言:javascript
运行
复制
\$\d{1,3}(?:,\d{3})*
票数 1
EN

Stack Overflow用户

发布于 2020-07-30 20:35:39

想出一个与$不匹配的正则表达式并不困难。提出一个与$不匹配的正则表达式,并一致地将这两个值放在一起,无论它们都是数字值还是Points值,因为捕获组1和2并不简单。如果使用命名捕获组,困难就会消失。这个regex需要来自regex存储库的PyPi模块,因为它多次使用相同的命名组。

代码语言:javascript
运行
复制
import regex


tests = [
    '$200 – $4,500',
    'Points – $2,500'
]

re = r"""(?x)       # verbose mode
^                   # start of string
(
    \$              # first alternate choice
    (?P<G1>[\d,]+)  # named group G1
  |                 # or
    (?P<G1>Points)  # second alternate choice
)
\x20–\x20           # ' – '
\$
(?P<G2>[\d,]+)      # named group g2
$                   # end of string
"""


# or re = r'^(\$(?P<G1>[\d,]+)|(?P<G1>Points)) – \$(?P<G2>[\d,]+)$'

for test in tests:
    m = regex.match(re, test)
    print(m.group('G1'), m.group('G2'))

指纹:

代码语言:javascript
运行
复制
200 4,500
Points 2,500

更新

@marianc的评论是正确的,但并没有确保输入中没有多余的字符。因此,有了他的有用投入:

代码语言:javascript
运行
复制
import re


tests = [
    '$200 – $4,500',
    'Points – $2,500',
    'xPoints – $2,500',
]


rex = r'((?<=^\$)\d{1,3}(?:,\d{3})*|(?<=^)Points) – \$(\d{1,3}(?:,\d{3})*)$'

for test in tests:
    m = re.search(rex, test)
    if m:
        print(test, '->', m.groups())
    else:
        print(test, '->', 'No match')

指纹:

代码语言:javascript
运行
复制
$200 – $4,500 -> ('200', '4,500')
Points – $2,500 -> ('Points', '2,500')
xPoints – $2,500 -> No match

请注意,由于行开始时执行的查找断言不能成功,所以将执行search而不是match。但是,我们在行的开头不强制执行任何无关的字符,方法是在查找后断言中包含^锚点。

票数 1
EN

Stack Overflow用户

发布于 2020-08-02 16:53:41

对于第一个捕获组,您可以使用匹配任一点的替换,并断言左边的是一个非空格字符,或者将数字与一个可选的十进制值匹配,如果支持的话,则断言左边的是一个使用正查找的美元符号。

对于第二个捕获组,没有其他选择,因此您可以匹配美元符号,并在组2中用可选的十进制值捕获数字。

代码语言:javascript
运行
复制
((?<=\$)\d{1,3}(?:,\d{3})*|(?<!\S)Points) – \$(\d{1,3}(?:,\d{3})*)

解释

  • ( Capture group 1
    • (?<=\$)\d{1,3}(?:,\d{3})*正向后,向左断言一个$,匹配1-3位数字,并重复0+,匹配逗号和3个数字。
    • |
    • (?<!\S)Points正向后,在左侧和匹配点处断言一个非空格字符

  • )闭组1
  • 匹配
  • \$匹配$
  • ( Capture group 2
    • \d{1,3}(?:,\d{3})*匹配1-3位数字和0+乘以逗号和3位数。

  • )紧群

Regex演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63177819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档