正则表达式:文本年鉴表。遗留的问题很多。。。用AI再想想
用AI进行测试如何?后续试着实现下
- 需求:读入txt文件,过滤文件有关年记录
0)读入txt文件
1)以“。”,中文句号,为界区分一句,最小统计单位
2)年格式:YYYY,4位
3)输出:YYYY:所在句子内容
4)说明
- 一句中包含多个年的,以“,”,中文逗号连接
- 剔除句中的非文字内容:换行符,非正常的标号等
- 按行输出过滤到的有关年记录 - AI提问 -- AI的思考过程帮助我们理清思路、补充异常处理过程
DeepSeek 文心一言 你是python专家,请用正则表达式对文本进行处理
1. 以中文句号开头、结尾为一个独立句子,两个句号之间为句子内容
2. 句子中不再包含句号
3. 提出每个句子中的4位数字作为年份标识好的,我现在需要解决用户的问题,使用正则表达式处理文本,按照他们的三个要求来做。首先,我需要仔细理解每个要求的具体含义。
第一个要求是,以中文句号开头和结尾作为一个独立句子,两个句号之间的内容是句子内容。也就是说,每个句子应该被两个中文句号包围,比如“。这是一个例子。”这样的结构。但这里可能存在一点疑问,用户是不是指句子以中文句号开头和结尾?比如,整个文本中的句子被分割成类似“。内容。”的结构?或者可能用户的意思是以中文句号作为分隔符,比如两个中文句号之间的部分是一个句子?比如文本可能是“。句子一。句子二。”这样,每个句子被包裹在两个句号之间?
这个时候可能需要进一步分析,但根据常规情况,可能用户的意思是,用两个中文句号来分割句子,例如句子被包裹在“。”之间。比如,文本中的结构是“。句子内容。”,然后另一个句子是另一个“。另一个句子。”。这种情况下,需要提取两个句号之间的内容作为独立句子,而每个独立句子本身不应该包含句号。
第二个要求是,句子中不再包含句号,也就是每个提取出来的句子内部没有句号,这可能意味着在分割句子的时候,必须确保在两个中文句号之间的内容里不含有其他句号。
第三个要求是提取每个句子中的4位数字作为年份标识,比如像“2023”这样的年份。
那现在,我需要分步骤处理:
第一步,使用正则表达式来分割文本,提取出所有以中文句号开头和结尾的句子。这里可能需要用正则表达式来匹配两个中文句号之间的内容,但要注意可能存在其他句号的情况。不过根据第二个条件,句子内部不应包含句号,所以可能每个匹配的部分必须不包含中文句号或者其他类型的句号?
不过,用户的第二个条件说明句子中不再包含句号,所以分割后的句子内部不会有句号。这可能意味着,在分割的时候,确保两个中文句号之间的内容不包含任何句号,或者用户在输入文本中的句子已经被正确分割,只需要正确匹配结构?
这里可能需要用正则表达式来找到所有符合“。”开头和结尾,中间不含句号的字符串。
例如,正则表达式可能是 r'。([^。]*)。',但需要确认是否正确。不过中文句号的Unicode是“\u3002”,所以可能需要使用unicode编码。或者用户提供的文本中是否使用全角句号?
假设处理的是中文文本,中文句号是“。”,那么正则表达式应该匹配这个符号。所以可能的正则式是:r'。(.*?)。',但是这样可能会匹配中间有内容的句子,但根据条件,句子中不能包含句号,所以中间的内容应该不含句号。所以,可能需要使用否定字符类,即中间不包含“。”的内容。
所以正确的正则表达式可能是:r'。([^。]+)。',这样匹配两个中文句号之间的非句号字符组成的字符串。这里用+确保至少有一个字符,避免匹配空句子。
这样,第一步可以提取出所有符合条件的句子。
接下来,对于每个提取的句子,需要从中找出4位数字作为年份。通常年份是介于1000到9999之间的数字,但用户可能只需要任何4位连续数字。比如,正则表达式可以是r'\d{4}',但需要注意是否可能包含其他情况,比如数字周围是否有边界,或者是否可能与其他数字相连,例如5位数字中的前四位或后四位。不过用户可能希望单独提取4位数字,所以可能需要使用边界判断,比如\b\d{4}\b,但中文中可能没有单词边界,所以可能需要使用环视断言,确保前后不是数字。
因此,正确的正则表达式可能是r'(?<!\d)\d{4}(?!\d)',这样确保匹配的是独立的4位数字,不会在更长数字中的一部分。
所以综合起来,步骤如下:
1. 使用正则表达式找到所有以中文句号包围且中间不含中文句号的句子。
2. 对每个找到的句子,使用正则表达式提取其中的4位数字作为年份。
3. 返回每个句子对应的年份列表。
现在需要考虑代码的结构。例如,输入的文本可能包含多个句子,每个句子被两个中文句号包围,但可能存在前后空格或其他情况,所以需要处理可能的空白字符?
例如,如果句子是“。 这是一个例子,2023年。。”,中间可能有空格,或者在句号周围有空格?用户是否允许这样的情况?
可能需要调整正则表达式,允许在中文句号前后有空格。例如,正则表达式可能修改为r'\s*。\s*([^。]+)\s*。\s*',这样忽略句号前后的空格。但具体要看用户的需求。
此外,用户提供的例子可能需要处理不同的情况,但