Регулярное выражение, соответствующее набору символов по заданному индексу - PullRequest
0 голосов
/ 23 октября 2019

У меня есть строка и позиция в этой строке. Я хочу выяснить, является ли последний непробельный символ перед этой позицией одним из символов в данном наборе. Могу ли я сделать это с помощью регулярных выражений? Я не мог понять это самостоятельно.

Пример с набором символов (?, |,!):

foo('blah? test', pos=6) is True

foo('blah? test', pos=7) is False

Ответы [ 5 ]

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

С некоторой помощью Regex:

In [93]: def is_matched(text, pos, chars='?|!'): 
    ...:     text = text[:pos] 
    ...:     matched = re.search(r'.*(\S)(?=\s*$)', text) 
    ...:     return matched.group(1) in chars if matched else False 
    ...:                                                                                                                                                                                                    

In [94]: is_matched('blah? test', pos=6)                                                                                                                                                                    
Out[94]: True

In [95]: is_matched('blah? test', pos=7)                                                                                                                                                                    
Out[95]: False

.*(\S)(?=\s*$):

  • .* соответствует любым символам до последнего непробельного символа

  • (\S) соответствует последнему непробельному символу и помещает его в захваченную группу

  • Позитивный взгляд нулевой ширины (?=\s*$) гарантирует, что шаблонсопровождается нулями больше пробелов только до конца

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

Здесь вам не нужно регулярное выражение. Удалите пробелы в конце среза, если они есть, и сравните последний символ

def is_matched(text, pos, chars='?|!'): 
   return text[:pos].rstrip()[-1] in chars

is_matched('blah? test', pos=6) #True
is_matched('blah? test', pos=7) #False
0 голосов
/ 23 октября 2019

Вам не нужно использовать регулярное выражение:

def foo(s, pos, chars='?|!'):
    for i in range(pos - 1, -1, -1):
        if s[i] == ' ':
            continue
        return s[i] in chars
    return False

print(foo('blah? test', pos=6))

Если вы должны были использовать регулярное выражение:

def foo(s, pos, chars='?|!'):
    l = re.findall(r'[^ ]', s[:pos]) # find all non-blank characters in first pos - 1 characters
    if not l:
        return False
    return l[-1] in chars
0 голосов
/ 23 октября 2019

Вам не нужно регулярное выражение для этого. Вы можете очень легко использовать списки any и .

s = 'blah? test'
print(any(v in s[4] for v in '?|!'))

Возвращает True.

Изменение s[4] на s[5] приводит к False

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

Предполагая, что вы хотите 0 проиндексированных строк

def foo(text, pos):
    return text[pos] in ['?','|','!']

foo('blah? test', pos=4) // True
foo('blah? test', pos=5) // False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...