Мне нужно написать регулярное выражение, которое распознает все числа с разделенной комой или нет, за исключением 4-значных чисел - PullRequest
1 голос
/ 08 октября 2019

Я хочу захватить все числа запятыми или не разделенными запятыми, за исключением 4-значных чисел:

Я хочу сопоставить эти числа (в моем случае число всегда разделено 3 цифрами)

978,763,835,536,363
123
123,456
123456
7456
3400

исключая такие годы, как

1200 till 2020

Я написал это

regex_patterns = [
re.compile(r'[0-9]+,?[0-9]+,?[0-9]+,?[0-9]+')
]

это работает хорошо, я не исключаю, сколько лет из этого числа ... большое спасибо

Конечно, я работаю над чувствующими, число в предложениях не является необходимым в первую очередь для такой строки

- То есть от 60 до 41, а от 100 000 до 65 656½,соответствующая величина для βυ Было найдено, что это 36 075,5621 (с эксцентриситетом 9165), что соответствует всей овальной траектории Марса. -Это было 4657.

РЕДАКТИРОВАТЬ:

Так как во время моей задачи я столкнулся с множеством проблем, несколько раз обновил вопрос.

Прежде всего проблема в том,в основном решено! спасибо за все за вклад.

просто очень маленькая проблема. основываясь на других комментариях, я интегрировал решение, как здесь

r'(?<!\S)(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?![\d,])[\u00BC-\u00BE\u2150-\u215E]?(?!x)(?!/)

Он может корректно уничтожить большую часть случая,

https://regex101.com/r/o5gdDt/8

и затем снова, как естьсвоего рода шум в моем тексте, подобный этому:

"Я принимаю за фигурную единицу [x]. Это квадрат GEOM также будет фигурной единицей [x2]. Добавьте квадрат GEOM на εο, 227 052,и сумма двух будет квадратом GEOM OMε или ψν. Но квадрат GEOM для βν равен 4,310,747,475 PARA "

. Он не может захватить число 227,052, которое заканчивается на", "

когда я его поменял я столкнулся с этой проблемой

(?<!\S)(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?![\d])[\u00BC-\u00BE\u2150-\u215E]?(?!x)(?!/)
``` (basically ignoring comma  in (,?![\d])) 

I faced with another problem which the regex captured 4,310,747,475 in this:

4,310,747,475x2+978,763,835,536,363


as you see here..
https://regex101.com/r/o5gdDt/9
any idea would be very appreciated 

however the regex now works almost good, but in order to be perfect I need to improve it





-


Ответы [ 4 ]

4 голосов
/ 08 октября 2019

Если исключить все 4-значные числовые годы, это

\b(?!\d{4}\b)[0-9]+(?:,(?!\d{4}\b)[0-9]+)*\b

https://regex101.com/r/T3L3X5/1

Если исключить только число лет между 1200 и 2020, это

\b(?!(?:12\d{2}|1[3-9]\d{2}|20[01]\d|2020)\b)[0-9]+(?:,(?!(?:12\d{2}|1[3-9]\d{2}|20[01]\d|2020)\b)[0-9]+)*\b

https://regex101.com/r/ZuC6LR/1

1 голос
/ 09 октября 2019

Это соответствует всем вашим тестам:

(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}|\d{1,3}(?:,\d{3})*)(?![\d,])

Объяснение:

(?<![\d,])              # negative lookbehind, make we haven't digit or comma before
  (?:                   # non capture group
    (?!                 # negative lookahead, make sure we haven't after:
      (?:               # non capture group
        1[2-9]\d\d      # range 1200 -> 1999
       |                # OR
        20[01]\d        # range 2000 -> 2019
       |                # OR
        2020            # 2020
      )                 # end group
    )                   # end lookahead
    \d{4,}              # 4 or more digits
   |                    # OR
    \d{1,3}             # 1 up to 3 digits
    (?:,\d{3})*         # non capture group, a comma and 3 digits, 0 or more times
  )                     # end group
(?![\d,])               # negative lookahead, make sure we haven't digit or comma after

Демо

1 голос
/ 08 октября 2019

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

\b\d{1,3}(?:,\d{1,3})*\b

https://regex101.com/r/T6sNUs/1/

Объяснение выглядит следующим образом:

  • \b - помечает границу слова, чтобы избежать частичного совпадения большего числа, чем 3 цифры
  • \d{1,3} - соответствует одно стрехзначное число
  • (?:,\d{1,3})* - группа без захвата, необязательно, соответствует запятому номеру, имеющему от одной до трех цифр
  • \b - снова помечает границу слова, чтобы избежать частичного совпадения при большем числе3 цифры

Редактировать: для требования, указанного в комментариях, где должны совпадать числа, по крайней мере, с тремя или более цифрами, необязательно разделенные запятой. Но он должен отклонить совпадение, если любое из чисел, присутствующих в строке, находится в диапазоне от 1200 до 2020.

Это регулярное выражение должно дать вам то, что вам нужно,

^(?!.*\b(?:1[2-9]\d\d|20[01]\d|2020)\b)\d{3,}(?:,\d{3,})*$

Демо

Пожалуйста, подтвердите, работает ли это для вас, поэтому я могу добавить объяснение к приведенному выше регулярному выражению.

И в случае, если вы хотите ограничить его с 1200 до 1800, как вы упомянули в ваших комментарияхВы можете использовать это регулярное выражение,

^(?!.*\b(?:1[2-7]\d\d|1800)\b)\d{3,}(?:,\d{3,})*$

Демо

0 голосов
/ 11 октября 2019

Вот окончательный ответ, который я получил с помощью комментариев и интеграции в соответствии с моим контекстом:

https://regex101.com/r/o5gdDt/8

Как вы видите этот код

(?<!\S)(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?![\d,])[\u00BC-\u00BE\u2150-\u215E]?(?!x)(?!/)

может захватить все цифры, которые разделены на 3 цифры в тексте, как

  • "здесь 100,100"
  • "23,456"
  • "1,435"

все более чем 4-значный номер, как без запятой

  • 2345

  • 1234 "здесь 123456"

также этот вид номера

  • 65,656½
  • 65,656½,
  • 23,123½

Единственныйкрошечная проблема здесь, если после первых двух типов есть запятая (точка), она не может захватить их. например, он не может захватить

  • "здесь 100,100",
  • "23,456,"
  • "1,435,"

к сожалению, есть несколько чисел intext, которые заканчиваются запятыми ... может кто-нибудь подскажет, как изменить это, чтобы захватить выше?

Я попытался сделать это, и измененная версия такова:

(?<!\S)(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?![\d])[\u00BC-\u00BE\u2150-\u215E]?(?!x)(?!/)

в основном я удаляю запятую в (?! [\ D,]), но это вызывает другую проблему в моем контексте, она захватывает часть числа, которая является частью уравнения, как это:

4,310,747,475x2 57,349,565,416,398x.

см. Здесь:

https://regex101.com/r/o5gdDt/10

Я знаю, что это особенный вопрос, я был бы рад узнать ваши иды

...