RegEx для сопоставления заглавных букв и цифр - PullRequest
1 голос
/ 08 мая 2019

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

  1. , например, как извлечь все шаблоны, такие как: AP70, ML71, GR55 и т. Д.
  2. и все шаблоны для последовательности слов, начинающихся с заглавной буквы, таких как: Hello Little Monkey, How Are You и т.д ..

Для первого случая я выполнил это регулярное выражение и не получил все совпадения:

>>> p = re.compile("[A-Z]+[0-9]+")
>>> res = p.search("aze azeaz GR55 AP1 PM89")
>>> res
<re.Match object; span=(10, 14), match='GR55'>

и для второго:

>>> s = re.compile("[A-Z]+[a-z]+\s[A-Z]+[a-z]+\s[A-Z]+[a-z]+")
>>> resu = s.search("this is a test string, Hello Little Monkey, How Are You ?")
>>> resu
<re.Match object; span=(23, 42), match='Hello Little Monkey'>
>>> resu.group()
'Hello Little Monkey'

это похоже на работу, но я хочу получить все совпадения при разборе целой 'большой' строки.

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Попробуйте эти 2 регулярных выражения:

(в целях безопасности они заключены в пробелы / границы запятой)


>>> import re
>>> teststr = "aze azeaz GR55 AP1 PM89"
>>> res = re.findall(r"(?<![^\s,])[A-Z]+[0-9]+(?![^\s,])", teststr)
>>> print(res)
['GR55', 'AP1', 'PM89']
>>>

Читаемое регулярное выражение

 (?<! [^\s,] )
 [A-Z]+ [0-9]+ 
 (?! [^\s,] )

и

>>> import re
>>> teststr = "this is a test string, ,Hello Little Monkey, How Are You ?"
>>> res = re.findall(r"(?<![^\s,])[A-Z]+[a-z]+(?:\s[A-Z]+[a-z]+){1,}(?![^\s,])", teststr)
>>> print(res)
['Hello Little Monkey', 'How Are You']
>>>

Читаемое регулярное выражение

 (?<! [^\s,] )
 [A-Z]+ [a-z]+ 
 (?: \s [A-Z]+ [a-z]+ ){1,}
 (?! [^\s,] )
2 голосов
/ 08 мая 2019

Это выражение может помочь вам сделать это или спроектировать. Кажется, вы хотите, чтобы в вашем выражении был хотя бы один [A-Z] и хотя бы один [0-9]:

(?=[A-Z])(?=.+[0-9])([A-Z0-9]+)

enter image description here

Graph

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

enter image description here

Пример кода:

Этот код показывает, как выражение будет работать в Python:

# -*- coding: UTF-8 -*-
import re

string = "aze azeaz GR55 AP1 PM89"
expression = r'(?=[A-Z])(?=.+[0-9])([A-Z0-9]+)'
match = re.search(expression, string)
if match:
    print("YAAAY! \"" + match.group(1) + "\" is a match ??? ")
else: 
    print('? Sorry! No matches! Something is not right! Call 911 ?')

Пример вывода

YAAAY! "GR55" is a match ??? 

Производительность

Этот фрагмент JavaScript показывает производительность вашего выражения, используя простой цикл for в 1 миллион раз.

repeat = 1000000;
start = Date.now();

for (var i = repeat; i >= 0; i--) {
	var string = 'aze azeaz GR55 AP1 PM89';
	var regex = /(.*?)(?=[A-Z])(?=.+[0-9])([A-Z0-9]+)/g;
	var match = string.replace(regex, "$2 ");
}

end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ??? ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ? ");
...