У меня есть несколько миллионов уравнений, таких как: 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, чтобы попытаться решить эту проблему. Я просто не могу найти/понять, что мне нужно.
Жадная природа регулярного выражения действительно является проблемой. Попробуйте это вместо этого:
rx = re.search(r'(?<=an equation:\s)(.*=[^\.]*)\.',e)
2 отличия в том, что я удалил '?' после вашего последнего периода, поскольку он не является факультативным согласно Вещам, которые всегда будут верными. # 4. Затем я сказал жадный бит после знака равенства, что он может соответствовать чему угодно, кроме периода. Это означает, что он перестанет соответствовать, как только он достигнет этого первого, необязательного периода.
В качестве быстрого совета я использовал Regex101.com для быстрого отладки вашего регулярного выражения. Я очень рекомендую его для создания регулярных выражений!
(?=\.)
Опустить период, следующий за уравнением.
(.*)\.
работай?