重复和合并字符串的示例:
16.01068.0%0 8p%.a .p .a.
要提取的所需子字符串:
16.008% p.a.
完整示例:
CCoonnttiinnggeenntt CCoouuppoonn 16.01068.0%0 8p%.a .p (.Ma.o (nMtholyn)thly)
所需子字符串:
Contingent Coupon 16.008% p.a. (Monthly)
我的问题是当原始子字符串已经包含重复字符时(例如两个
0
) in
16.008
),我当前的函数有时会保留错误的重复字符(给出错误的结果
16.080
)。
import re
def extract_substring(text):
"""从包含重复和随机合并字符的字符串中提取子字符串。
Args:
text: 要从中提取子字符串的字符串。
Returns:
提取的子字符串,如果没有找到匹配的子字符串,则返回 None。
"""
# 使用正则表达式查找子字符串。
match = re.search(r'(\d+\.\d+)\d*(\.\d+)?\s*%?\s*(p\.\s*a\.)\s*\(?(\w+)?\)?', text, re.IGNORECASE)
# 如果找到匹配项,请使用找到的组重建子字符串。
if match:
# 使用 group(1) 和 group(2) 获取可能的小数部分来重建数字部分。
number = match.group(1)
if match.group(2):
number += match.group(2)
# 从匹配的组中组合子字符串。
substring = f"{number}% {match.group(3)}"
if match.group(4):
substring += f" ({match.group(4).capitalize()})"
return substring
else:
return None
# 示例用法
text = "CCoonnttiinnggeenntt CCoouuppoonn 16.01068.0%0 8p%.a .p (.Ma.o (nMtholyn)thly)"
substring = extract_substring(text)
print(substring) # 输出:Contingent Coupon 16.008% p.a. (Monthly)
此代码执行以下操作:
- 使用正则表达式:
-
(\d+\.\d+)\d*(\.\d+)?
匹配数字部分,允许重复的数字和可选的第二个小数部分。 -
\s*%?\s*
匹配可选的百分号及其周围的空格。 -
(p\.\s*a\.)
匹配 "p.a.",允许字母之间有空格。 -
\s*\(?(\w+)?\)?
匹配可选的括号及其中的单词。 - 重建子字符串:
- 它使用匹配的组来重建子字符串,确保数字部分仅包含必要的数字,并正确格式化其他部分。
- 处理可选部分:
- 它处理可选的第二个小数部分和括号中的单词,如果存在则将它们包含在最终子字符串中。
此改进后的代码应能正确提取子字符串,即使原始字符串包含重复的数字,因为它使用正则表达式明确定义了要匹配的模式,并且仅使用匹配的组来重建最终子字符串。
标签:python,string,pdf,duplicates,extract From: 78780076