【问题标题】:Regex to find integers in brackets正则表达式查找括号中的整数
【发布时间】:2020-03-19 21:53:35
【问题描述】:

我正在尝试使用 python 的正则表达式在字符串中的括号内查找整数。规则是数字和括号之间可以有空格,但除了构成整数的字符之外,没有其他字符。这是我的代码:

import re
a = "  afd [asd] [12 ] [a34]  [ -43 ]tt [+12]xxx"
b = "  afd [asd] [12 ] [a34]  [       -43 ]tt [+12]xxx!"
c = "  afd [128+] [47 ] [a34]  [ +-43 ]tt [+12]xxx"
from_a = re.findall(r'\[[\s+]*(-?\d+)\s*\]',a)
from_b = re.findall(r'\[[\s+]*(-?\d+)\s*\]',b)
from_c = re.findall(r'\[[\s+]*(-?\d+)\s*\]',c)

这个特殊的正则表达式适用于字符串 a 和 b 并提供所需的输出。但是,在字符串 c 中,当括号 '[' 或空格后有两个(+ 或 -)符号时,正则表达式应忽略该整数。

编辑

expected results
from_a = [12,-43,12]
from_b = [12,-43,12]
from_c = [47,12]

【问题讨论】:

  • 为什么要忽略它? +[\s+]* 匹配,--? 匹配
  • 如果您想允许可选的+- 但不能同时使用,请使用[-+]?\d+
  • 一次只能有一个 + 或 - 号。如果有两个,则需要忽略整数
  • 你的意思是你想要\[\s*(-?\d+)\s*]?还是\[\s*([-+]?\d+)\s*]?你应该已经指出了预期的结果。
  • 希望我的回答有所帮助。

标签: regex python-3.x


【解决方案1】:

你可以使用

\[\s*(?:\+(?=\d))?(-?\d+)\s*]

请参阅regex demo

详情

  • \[ - 一个 [ 字符
  • \s* - 0+ 个空格
  • (?:\+(?=\d))? - 一个可选的+,后面必须跟一个数字
  • (-?\d+) - 第 1 组:可选的 -,然后是 1+ 位
  • \s* - 0+ 个空格
  • ] - 一个 ] 字符。

Python demo:

import re
strs = ['  afd [asd] [12 ] [a34]  [ -43 ]tt [+12]xxx','  afd [asd] [12 ] [a34]  [       -43 ]tt [+12]xxx!','  afd [128+] [47 ] [a34]  [ +-43 ]tt [+12]xxx']
for s in strs:
    print( re.findall(r'\[\s*(?:\+(?=\d))?(-?\d+)\s*]', s) )

输出:

['12', '-43', '12']
['12', '-43', '12']
['47', '12']

【讨论】:

    【解决方案2】:

    + 不应与\s 放在括号中。这允许在数字前有任意数量的+ 字符,可以选择以- 开头。

    使用[-+]? 允许在数字开头使用可选符号。

    from_c = re.findall(r'\[\s*([-+]?\d+)\s*\]',c)
    print(from_c)
    ['47', '+12']
    

    【讨论】:

      猜你喜欢
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      相关资源
      最近更新 更多