регулярное выражение для поиска только однозначного числа - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь найти предложения, имеющие только однозначное число вместе с

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 голосов
/ 29 ноября 2018

Ваш вопрос немного неясен, но я понимаю, что вы хотите сопоставлять только предложения, в которых есть только одна цифра, которая может повторяться в предложениях несколько раз, но не должна превышать одну цифру в каждом конкретном случае.Мол,

  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) -> Отрицательный взгляд вперед, который гарантирует, что предложение не содержит многозначных чисел.
  • .* -> Соответствует любому тексту
  • $ -> Конец строки

Демо

Вот пример кода 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
0 голосов
/ 29 ноября 2018

Мы можем попробовать использовать re.search со следующим шаблоном:

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

Это положительный прогноз, который будет верным, если две (или более) цифры появятся где-либо в строке.В частности, мы не хотим, чтобы этот шаблон соответствовал, чтобы подтвердить ваш ввод.

sentence="I'm 30 years old."
if not re.search("(?=.*\d.*\d).*", sentence):
    print 'match'
else:
    print 'no match'
0 голосов
/ 29 ноября 2018

Вы должны добавить отрицательный взгляд назад и отрицательный взгляд вперед, чтобы избежать цифр до и после отдельной цифры:

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")
0 голосов
/ 29 ноября 2018

Вместо этого используйте этот шаблон (он ищет однозначные цифры):

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

Вывод:

None

Это также работает для символов Юникода в Python 3. Для учета пунктуации, вы можете использовать \b\d(\b|\.|\?|\!)

...