Как создать регулярное выражение, чтобы проверить, является ли строка числом с плавающей запятой с 7 цифрами и любым значением после запятой?

#python #regex

#python #регулярное выражение

Вопрос:

Как создать регулярное выражение, чтобы проверить, является ли строка числом с плавающей запятой с 7 цифрами и любым значением после запятой?

Приемлемо в качестве десятичного разделителя; : — , . ?

Итак, мне нужно:

 import re

    rgx = re.compile('What is the regex sintaxe for it ?')

tests=[7000000.00 7000000:00 7000000,00 7000000-00 7AAAAAA.00 700000000.00 70.00]

for s in tests:
    m = rgx.search(s)
    print(bool(m), s)

True 7000000.00
True 7000000:00
True 7000000,00
True 7000000-00
False 7AAAAAA.00
False 700000000.00
False 70.00
 

]

Пример использования регулярных выражений

 import re
    
    rgx = re.compile(r'd (?:,d*)?')
    
    tests=['7000000.00', '7000000:00', '7000000,00', '7000000-00', '7AAAAAA.00', '700000000.00', '70.00']
    
    for s in tests:
        m = rgx.search(s)
        print(bool(m), s)
 

Комментарии:

1. Можете ли вы показать воспроизводимый пример вашего кода? То, что вы показали в вопросе, синтаксически неверно

2. Мне просто нужно синтаксическое регулярное выражение; Но хорошо, я опубликую для вас несколько примеров.

3. Этот сайт отлично подходит для разработки шаблонов регулярных выражений pythex.org

Ответ №1:

Проверьте 7 digits , за которым следует единица non whitespace, non digit and non alphanumeric character и заканчивается на unlimited numbers :

 import re

rgx = re.compile(r'[0-9]{7}[SDW]{1}[0-9] 

Out:

 (True, '7000000.00')
(True, '7000000:00')
(True, '7000000,00')
(True, '7000000-00')
(False, '7AAAAAA.00')
(False, '700000000.00')
(False, '70.00')
 

Комментарии:

1. Спасибо, не могли бы вы объяснить, как работает синтаксис регулярных выражений для этого случая, пожалуйста?

2. @Kinille: выдает тот же результат, что и ваш, и то, что ожидает op.

3. @MauriceMeyer Я тестирую их взад и вперед, и у них разные результаты в шестом случае? Редактировать, я изучаю, как мое тестирование неверно

4. @Kinille: я получаю 4 истины и 3 ложности в Python 2.7 и 3.9

5. Ваш шаблон неверен из-за [SDW]{1} . S содержит цифры. Так 12345678910111213 будет соответствовать вашему шаблону. Кроме того, W включено внутри D (поскольку d включено внутри w ). Короче [SDW]{1} говоря, это точно так . же (с re.dotall флагом, поскольку он также соответствует новым строкам). Я думаю, что символьный класс с разрешенным только десятичным разделителем (и без квантора) более прост и работает.

Ответ №2:

После указания класса символов вы можете указать, сколько из этого символа необходимо, используя фигурные скобки, т.е. {1,2} означает от 1 до 2 символов или {4} означает 4 символа

 re.compile(r'(^|D)d{7}[-.;:,]d ')
 

Вот краткое изложение регулярного выражения:

(^|D) Означает, что либо символ не должен быть числом, либо должен быть началом строки
d{7} Семь цифр подряд
[-.;:,] Любой из ваших символов, обозначающий десятичную точку
d Одна или несколько цифр

Конечно, вы можете добавить ^ и $, чтобы убедиться, что число является единственным в строке, если это полезно.

Комментарии:

1. Не слишком быстро! Каждый сокращенный символьный класс d , w , s ... имеет свое дополнение (в смысле теории множеств), D , W , S ...

)
# [0-9]{7} >> Seven digits
# [SDW]{1} >> One non whitespace, non digit and non alphanumeric character
# [0-9].$ >> Ends with unlimited numbers

tests = "7000000.00 7000000:00 7000000,00 7000000-00 7AAAAAA.00 700000000.00 70.00"

for t in tests.split(" "):
print(True if rgx.match(t) else False, t)
Out:


Комментарии:

1. Спасибо, не могли бы вы объяснить, как работает синтаксис регулярных выражений для этого случая, пожалуйста?

2. @Kinille: выдает тот же результат, что и ваш, и то, что ожидает op.

3. @MauriceMeyer Я тестирую их взад и вперед, и у них разные результаты в шестом случае? Редактировать, я изучаю, как мое тестирование неверно

4. @Kinille: я получаю 4 истины и 3 ложности в Python 2.7 и 3.9

5. Ваш шаблон неверен из-за [SDW]{1} . S содержит цифры. Так 12345678910111213 будет соответствовать вашему шаблону. Кроме того, W включено внутри D (поскольку d включено внутри w ). Короче [SDW]{1} говоря, это точно так . же (с re.dotall флагом, поскольку он также соответствует новым строкам). Я думаю, что символьный класс с разрешенным только десятичным разделителем (и без квантора) более прост и работает.

Ответ №2:

После указания класса символов вы можете указать, сколько из этого символа необходимо, используя фигурные скобки, т.е. {1,2} означает от 1 до 2 символов или {4} означает 4 символа


Вот краткое изложение регулярного выражения:

(^|D) Означает, что либо символ не должен быть числом, либо должен быть началом строки
d{7} Семь цифр подряд
[-.;:,] Любой из ваших символов, обозначающий десятичную точку
d Одна или несколько цифр

Конечно, вы можете добавить ^ и $, чтобы убедиться, что число является единственным в строке, если это полезно.

Комментарии:

1. Не слишком быстро! Каждый сокращенный символьный класс d , w , s … имеет свое дополнение (в смысле теории множеств), D , W , S