你可以使用带有2个捕获组的交替,然后检查哪个组存在。
\b(\d+(?:\,\d+)?)\s*%|%\s*(\d+(?:\,\d+)?)\b
查看正则表达式演示。
该表达式匹配:
\b
单词边界
(\d+(?:\,\d+)?)\s*%
捕获第1组 - 匹配带有可选小数、可选空格字符和%
的数字
|
或者
%\s*(\d+(?:\,\d+)?)
捕获第2组 - \b
单词边界 - 与第1组相反
\b
单词边界
例如:
import re
regex = r"\b(\d+(?:\,\d+)?)\s*%|%\s*(\d+(?:\,\d+)?)\b"
test_str = ("Käuferprovision: 3 % zzgl. gesetzl. MwSt.\n"
"Käuferprovision: Die Courtage i.H.v. % 3,57 inkl. MwSt. ist")
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
if match.group(1):
print(match.group(1).replace(',', '.'))
else:
print(match.group(2).replace(',', '.'))
输出
3
3.57
如果百分号之间的空格是固定的,你也可以使用预测后缀来匹配字符串,而不需要捕获组。
(?<=% )\b\d+(?:,\d+)\b|\b\d+(?:,\d+)?(?= %)
查看另一个正则表达式演示。
示例
import re
pattern = r"(?<=% )\b\d+(?:,\d+)\b|\b\d+(?:,\d+)?(?= %)"
test_str = ("Käuferprovision: 3 % zzgl. gesetzl. MwSt.\n"
"Käuferprovision: Die Courtage i.H.v. % 3,57 inkl. MwSt. ist")
for s in re.findall(pattern, test_str):
print(s.replace(",", "."))
输出
3
3.57