仅搜索一位数字的正则表达式

时间:2018-11-29 04:49:07

标签: python regex data-science

我正试图找到只有一位数字的句子。

sentence="I'm 30 years old."
print(re.match("[0-9]", sentence)

然后返回

<re.Match object; span=(0, 1), match='3'>

,但实际上是30,是两位数,我不希望它匹配。 似乎每个由3和0组成的数字都被认为是一个独立的数字。 这些数字是我国通常使用的两字节数字。

如何更改我的正则表达式? 谢谢!

4 个答案:

答案 0 :(得分:0)

请改用此模式(它寻找一位数字):

import re
print(re.search(r'\b\d\b', "I'm 30 years old."))

输出:

None

这也适用于Python 3中的Unicode字符。要同时考虑标点符号,可以使用\b\d(\b|\.|\?|\!)

答案 1 :(得分:0)

我们可以尝试通过以下模式使用re.search

(?=.*\d.*\d).*

这是一个正向的前瞻,如果在字符串中的任何位置出现两个(或更多)数字,则为true。具体来说,我们希望此模式匹配,以验证您的输入。

sentence="I'm 30 years old."
if not re.search("(?=.*\d.*\d).*", sentence):
    print 'match'
else:
    print 'no match'

答案 2 :(得分:0)

您应该在后面加上负向后看和反前看,以避免出现在独立数字前后的数字:

re.findall("(?<!\d)\d(?!\d)", "200 20 1 20 200 20 2")
#['1', '2']
re.findall("(?<!\d)\d(?!\d)", "200 20 20 200 20")
#[]
if not re.findall("(?<!\d)\d(?!\d)", "200 20 20 200 20"):
    print("no single-digit numbers")
else:
    print("some single-digit numbers")

答案 3 :(得分:0)

您的问题有点不清楚,但据我了解,您只想匹配只有一位数字的句子,该句子可以在句子中重复多次,但在任何特定情况下都不应超过一位数字。喜欢,

  1. 我30岁。 (这不匹配,因为它有30个多于一位的数字)
  2. 我3岁。 (这应该匹配,因为它只有3个数字,只有一位数字)
  3. 我3岁,您30岁。 (这不应该匹配,因为它有3和30,其中30是多位数字)
  4. 我3岁,您5岁。 (这应该匹配,因为它有3和5只是一个数字)
  5. 我是一个好男孩。 (这不匹配,因为它根本没有任何数字)

让我知道这是否是您想要的。如果是的话,您可以使用此正则表达式,

^(?!.*\d\d)(?=.*\d).*$

说明:

  • ^->字符串开头
  • (?!.*\d\d)->否定前瞻,可确保句子不包含任何多位数的数字。
  • (?!.*\d\d)->否定前瞻,可确保句子不包含任何多位数的数字。
  • .*->匹配任何文本
  • $->字符串结尾

Demo

这是示例python代码,

arr= ["I'm 30 years old.","I'm 3 years old.", "I'm 3 years and you are 30 years old.", "I'm 3 years and you are 5 years old.", "I am a good boy."]

for s in arr:
    if re.search("^(?!.*\d\d)(?=.*\d).*$", s):
        print(s+' --> Sentence has only one digit')
    else:
        print(s+' --> Sentence has either no digit or more than one digit')

哪个输出

I'm 30 years old. --> Sentence has either no digit or more than one digit
I'm 3 years old. --> Sentence has only one digit
I'm 3 years and you are 30 years old. --> Sentence has either no digit or more than one digit
I'm 3 years and you are 5 years old. --> Sentence has only one digit
I am a good boy. --> Sentence has either no digit or more than one digit