Как я могу написать регулярное выражение в Python, которое останавливается на первом периоде в строке, которая имеет непредсказуемые символы?

1

У меня есть несколько миллионов уравнений, таких как: an equation: a(%)^ + b# = (+)C!.

Я хочу вернуть: a(%)^ + b# = (+)C!

Вещи, которые всегда будут истинны для уравнения:
1. Он начнется с "уравнения:"
2. Он будет содержать знак равенства (=) между двумя пробелами.
3. Он будет содержать любое количество плюсовых знаков (+) между двумя пробелами.
4. Это закончится периодом (.).

Вещи, которые могут быть правдой:
1. Уравнение может содержать дополнительные + и =, но не очерченные пробелами.
2. Уравнение может содержать дополнительную информацию после периода, и эта информация может содержать период. Например:

an equation: a(%)^ + b# = (+)C!. An annotation about the (!!*) equation.  

3. Я полагаю, что в уравнении есть периоды. Я сомневаюсь в этом, и я думаю, что если они действительно произойдут, они придут перед (левой стороной) равного знака.
4. Уравнение может не существовать. Строка никогда не будет пустой, но она может не содержать уравнения (т.е. С четырьмя всегда истинными критериями).

Вот что я имею до сих пор:

e = "an equation: a(%)^ + b# = (+)C!. An annotation about the (!!*) equation."
rx = re.search(r'(?<=an equation:\s)(.*=.*)\.?',e)
print rx.group(0)

Позвольте мне объяснить каждую часть регулярного выражения:
(r'(?<=an equation:\s) находит "уравнение" плюс любое количество пробелов, но не сохраняет его.
(.*=.*) утверждает, что должен быть знак равенства. Я обнаружил, что это почти наверняка будет универсально исключать не уравнения. Если это не так, я могу обнаружить и обработать несколько разных случаев.
.\? На мой взгляд, это должно найти первый период (т.е. Избежать типичной интерпретации использования) после знака =, а затем остановиться. Однако это не так.

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

a(%)^ + b# = (+)C!. An annotation about the (!!*) equation.

Я думаю, что это .\? и жадная природа регулярного выражения - проблема. Я пробовал много других комбинаций с .\ И ? и [] с и без (). Все они возвращаются либо, как указано выше, со вторым утверждением об аннотации или NoneType (т. NoneType Без соответствия). Теперь я чувствую полную потерю того, как остановиться после первого периода.

Спасибо заранее за вашу помощь. Я провел два дня на этом сайте и использовал документы Python, чтобы попытаться решить эту проблему. Я просто не могу найти/понять, что мне нужно.

  • 0
    Не будет (.*)\. работай?
  • 0
    У каждого из этих одна строка? В какой форме эти уравнения входят вместе. Не могли бы вы просто подстроковать каждую строку по 12 символов до второго последнего символа?
Показать ещё 8 комментариев
Теги:

1 ответ

2
Лучший ответ

Жадная природа регулярного выражения действительно является проблемой. Попробуйте это вместо этого:

rx = re.search(r'(?<=an equation:\s)(.*=[^\.]*)\.',e)

2 отличия в том, что я удалил '?' после вашего последнего периода, поскольку он не является факультативным согласно Вещам, которые всегда будут верными. # 4. Затем я сказал жадный бит после знака равенства, что он может соответствовать чему угодно, кроме периода. Это означает, что он перестанет соответствовать, как только он достигнет этого первого, необязательного периода.

В качестве быстрого совета я использовал Regex101.com для быстрого отладки вашего регулярного выражения. Я очень рекомендую его для создания регулярных выражений!

  • 0
    милые загадки с регулярными выражениями всегда веселые, странным образом "я люблю мучить себя"
  • 0
    Спасибо. Это отличный инструмент. Я видел много скриншотов здесь, когда я искал ответы, но я не исследовал это, как я должен был. Я также вижу, что могу (?=\.) Опустить период, следующий за уравнением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню