根据多个正则表达式匹配分割字符串
根据多个正则表达式匹配分割字符串
我有一个需要用正则表达式处理的字符串(或类似的情况):
"Text Table 6-2: 研究儿童的管理和行动"
- 我需要做的是检测单词Table以及前面的单词(如果存在)
- 检测接下来的数字,它们可以是这样的格式:
6或6-2或66-22或66-2
- 最后是字符串的剩余部分(在这个例子中是:研究儿童的管理和行动)
完成后,返回值应该如下所示:
将1和2作为一个字符串返回,将剩余部分作为另一个字符串返回 例如,返回值应该是这样的:Text Table 6-2,研究儿童的管理和行动
以下是我的代码:
mystr = "Text Table 6-2: 研究儿童的管理和行动" if re.match("([a-zA-Z0-9]+[ ])?(figure|list|table|Figure|List|Table)[ ][0-9]([-][0-9]+)?", mystr): print("匹配成功") parts_of_title = re.search("([a-zA-Z0-9]+[ ])?(figure|list|table|Figure|List|Table)[ ][0-9]([-][0-9]+)?", mystr) print(parts_of_title) print(" ".join(parts_of_title.group().split()[0:3]), parts_of_title.group().split()[-1])
第一个要求返回了true,正如应该的那样,但第二个没有返回true,所以我修改了代码并使用了compile
,但是regex
的功能发生了变化,代码如下:
mystr = "Text Table 6-2: 研究儿童的管理和行动" if re.match("([a-zA-Z0-9]+[ ])?(figure|list|table|Figure|List|Table)[ ][0-9]([-][0-9]+)?", mystr): print("匹配成功") parts_of_title = re.compile("([a-zA-Z0-9]+[ ])?(figure|list|table|Figure|List|Table)[ ][0-9]([-][0-9]+)?").split(mystr) print(parts_of_title)
输出结果:
匹配成功 ['', 'Text ', 'Table', '-2', ':\t研究儿童的管理和行动']
所以基于这个结果,我如何才能实现这个要求并保持代码的清晰可读性?为什么使用compile
会改变匹配结果?
Split String based on multiple Regex matches这个问题的出现的原因是因为原始的正则表达式模式无法正确地匹配字符串并分割出所需的部分。在原始的正则表达式模式中,有两个问题导致匹配错误。
首先,在第一部分中,调用了`.group().split()`,其中`.group()`返回的是完整的匹配结果,是一个字符串。这样做无法正确分割字符串。
其次,在第二部分中,调用了`re.compile("...").split()`,其中`re.compile`返回的是一个正则表达式对象,也无法正确分割字符串。
为了解决这个问题,可以修改正则表达式模式,并使用适当的方法来分割字符串。在修改后的正则表达式模式中,将原始模式中只能匹配一个单词的部分`[a-zA-Z0-9]+[ ]`修改为一个捕获组`[0-9]([-][0-9]+)?`,并添加了其他的捕获组。修改后的正则表达式模式如下:
^(.*? )?((?:[Ll]ist|[Tt]able|[Ff]igure))\s+(\d+(?:-\d+)?):\s+(.+)
这个正则表达式模式可以正确匹配并分割字符串。可以使用Python的re模块来使用这个正则表达式模式进行匹配和分割。以下是使用该模式进行匹配和输出的示例代码:
import re pattern = r"^(.*? )?((?:[Ll]ist|[Tt]able|[Ff]igure))\s+(\d+(?:-\d+)?):\s+(.+)" s = "Text Table 6-2: Management of children study and actions" m = re.match(pattern, s) if m: print(m.groups())
输出结果为:
('Text ', 'Table', '6-2', 'Management of children study and actions')
如果希望将第1和第2部分作为一个字符串输出,可以修改正则表达式模式,只使用两个捕获组。修改后的正则表达式模式如下:
^((?:.*? )?(?:[Ll]ist|[Tt]able|[Ff]igure)\s+\d+(?:-\d+)?):\s+(.+)
这个正则表达式模式可以正确匹配并分割字符串。以下是使用该模式进行匹配和输出的示例代码:
import re pattern = r"^((?:.*? )?(?:[Ll]ist|[Tt]able|[Ff]igure)\s+\d+(?:-\d+)?):\s+(.+)" s = "Text Table 6-2: Management of children study and actions" m = re.match(pattern, s) if m: print(m.groups())
输出结果为:
('Text Table 6-2', 'Management of children study and actions')
如果想要学习这种写法的正则表达式,可以参考一些很有用的网站,如`rexegg.com/regex-quickstart.html`和`regular-expressions.info`。这些网站提供了丰富的正则表达式教程和资料,可以帮助你更好地理解和学习正则表达式的使用方法。