Шаблоны регулярных выражений - PullRequest
0 голосов
/ 06 августа 2020

У меня есть такая строка x, когда я пытаюсь удалить текст на веб-сайте и столкнулся с этой проблемой:

x = 'P. 4. (5.2x4) abc 5.2x4 aoohrwow'

Я хочу создать шаблон регулярного выражения, который может удалить 5.2x4 Из-за того, что пользователь вводит размеры по разному шаблону, у меня был этот шаблон, который может охватывать почти все обстоятельства (например, строка y, z, v), кроме строки x выше.

y = 'abc 5.2 x 4 nsdf'

z = 'abc (5.2)3x 4ohsdf'

v = 'abc 5.2(4.) x4. qoqwh'

С моим шаблоном из строки x я получил 4.(5.2x4), но мне нужна 5.2x4 часть .

Мой шаблон на данный момент:

p = r'[(]?(\s)?(\d+)?(\.)?(\d+)?(\s)?[)]?(\s)?[(]?(\s)?\d+(\.)?(\d+)?(\s)?[)]?' \
    r'(\s)?x(\s)?' \
    r'[(]?(\s)?(\d+)?(\.)?(\d+)?(\s)?[)]?(\s)?[(]?(\s)?\d+(\.)?(\d+)?(\s)?[)]?'

Кто-нибудь может мне в этом помочь? Спасибо за ваше время.

Edit В общем, то, что мне нужно извлечь из строки, будет иметь такой шаблон:

(1.2)(3.4)x(5.6)

Строки, которые я отбрасываю с веб-сайта, могут упустить часть этого. В приведенной выше строке x мой код неправильно считает 4. в P. 4. как одну из частей измерения, но на самом деле это не так.

Могу ли я искать шаблон в строке от конца до начала ? Если да, могу решить эту проблему

1 Ответ

0 голосов
/ 06 августа 2020

Поскольку ваши примеры сильно различаются от одного к другому, и я предполагаю, что вы хотите точно 5.2x4 от каждого из них, я дам вам фрагмент кода, который действительно работает для примеров, которые работают, и позволю я знаю, есть ли такие, которые не справляются с этим:

import re


examples = ["P. 4. (5.2x4) abc 5.2x4 aoohrwow",
"abc 5.2 x 4 nsdf", "abc (5.2)3x 4ohsdf",
"abc 5.2(4.) x4. qoqwh"]

for x in examples:
    stripped = x.replace(' ', '')
    matches = list(map(lambda match: ''.join(match), re.findall(r"(\d+\.\d+)[^x]*?(x\d+)", stripped)))
    
    print(matches)

"""
output:
['5.2x4', '5.2x4']
['5.2x4']
['5.2x4']
['5.2x4']
"""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...