在文本中搜索给定范围内的数字(使用正则表达式?)

时间:2018-09-07 15:50:12

标签: python regex

一个非常简单的问题,我如何使用re.search()函数在文本中搜索介于1到30之间的任何数字?

我使用了re.search(text, '[1-30]+'),但是由于某种原因,我只返回了数字1和3,其中我的文本包含数字14、18、23。如果re.search()不是要使用的函数,请让我知道我可以使用的另一个功能,也许可以举个例子。

4 个答案:

答案 0 :(得分:2)

您不想为此使用正则表达式。 [1-30]+匹配1-3范围内的一个或多个字符或数字0 ... 1230

相反,提取您的数字,将其转换为整数,然后使用><

进行比较。

答案 1 :(得分:1)

如果您真的想使用正则表达式,可以执行类似re.search(text, '([1-9]|[0-2][0-9]|30)+的操作,但这似乎并不是最有效的方法

答案 2 :(得分:0)

正则表达式用于匹配字符串模式,而不是数据对象。正则表达式[1-30]+与数字0, 1, 2, 3匹配,因为[..]构成字符类,而-定义字符范围。

相反,您需要考虑如何将0到30之间的所有数字都表示为字符串。

它们是三种模式之一:

  1. 1,2,3,4,5,6,7,8,9的一位数字,可以是[1-9]的正则表达式的缩写,表示该范围内的一位数字;
  2. 接下来,您将获得数字10-29的字符串表示形式,该数字为两位数字。您可以使用正则表达式[1-2][0-9]来表示10到29之间的所有数字;
  3. 最后,30的结束值与文字字符串30匹配。
  4. 这三个替代匹配项与正则表达式捆绑在一起以进行更改|
  5. 您需要确定如何匹配子字符串,例如-2ab2。那是比赛吗?下面的正则表达式将匹配这些子字符串。

所有这些匹配都需要断言\b来表示数字行程的开始或结束,以不匹配较大数字串中的子字符串-例如{{1}中的29 }

因此529是一个完整的正则表达式,用于匹配1到30之间的整数值的字符串表示形式。

演示:

r'(\b[1-9]\b|\b[1-2][0-9]\b|\b30\b)'

如果您只想匹配表示范围>>> re.findall(r'(\b[1-9]\b|\b[1-2][0-9]\b|\b30\b)','\n'.join([str(i) for i in range(500)])) ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30'] 的独立字符串(即不匹配1-30-29),则可以使用:

ab2

Demo

Python演示

r'(?:^|[ \t]+)([1-9]|[1-2][0-9]|30)(?=[ \t]|$)'

答案 3 :(得分:0)

正则表达式用于搜索字符模式。您可以破解它以搜索某个范围内的十进制数字,但这很麻烦:

https://www.regular-expressions.info/numericranges.html

但是,正则表达式速度很快,我们绝对希望利用它来查找文本块中可能是数字的任何内容。

有了这个数字后,我们将使用Python检查它是否在范围内。

您可能需要做几件事:您可能想查找所有匹配项,或者可能只想查找第一个匹配项,在这种情况下,查找所有其他匹配项是浪费时间。此函数返回一个迭代器,因此您可以在两种情况下都使用它。

(define (s a b c)
  (/ (+ a b c) 2))

(define (area a b c)
  ((sqrt (*(- (s a b c)(a))
           (-(s a b c)(b))
           (-(s a b c)(c)))
         )))