Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用正则表达式提取后跟特定语法(如括号)的特定单词_Python_Regex_Pattern Matching - Fatal编程技术网

Python 使用正则表达式提取后跟特定语法(如括号)的特定单词

Python 使用正则表达式提取后跟特定语法(如括号)的特定单词,python,regex,pattern-matching,Python,Regex,Pattern Matching,我有一个非常大的文档,包含不同格式的章节参考。我想使用Python和regex提取这些引用 字符串格式的示例: 1) 第23节 2) 第45(3)条 3) 第75条第(e)点 4) 第21(1)、54(2)、78(1)条 现在,我有以下代码: s = "This is a sample for Section 231" m = re.search('Section\\W+(\\w+)', s) m.group(0) 输出为:第231节 除了不考虑其他格式的情况外,这种方法非常有效 是否有任何

我有一个非常大的文档,包含不同格式的章节参考。我想使用Python和regex提取这些引用

字符串格式的示例:

1) 第23节

2) 第45(3)条

3) 第75条第(e)点

4) 第21(1)、54(2)、78(1)条

现在,我有以下代码:

s = "This is a sample for Section 231" 
m = re.search('Section\\W+(\\w+)', s)
m.group(0)
输出为:
第231节

除了不考虑其他格式的情况外,这种方法非常有效

是否有任何方法表明对于
231(1)
,也应提取
(1)
?或者,如果列出了其他几个章节,是否包括以下章节编号

如果你认为正则表达式在这种情况下不是最好的,我也愿意使用其他库。谢谢大家!

试试看:

Sections?\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*

说明:

  • Sections?
    将“Section”与可选的
    s
  • \W+(\W+)(\(\W+\)?
    匹配节号/标题(如您所做),并在括号中添加可选文本
  • (,(\w+)(\(\w+\)?)*
    允许在逗号和空格后重复节号模式
编辑
要排除另一本书的
第1节
,您可以使用单词边界和负前瞻的组合:

Sections?\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*\b(?! of)

  • \b
    确保匹配到单词末尾
  • (?!of)
    检查单词边界后是否没有空格后跟
    of

对于这一点,可能永远不会有一个包罗万象的正则表达式-但是下面的内容非常接近您想要的:

Sections?( *\d+((\(\d+\))*,?(?= *))*)+
章节?
=
章节
章节

(*\d+(\(\d+\)*,?(?=*)*)+
=1或多个:0或多个空格,然后是1或多个数字,可选后跟大括号中的1或多个数字,然后可选逗号和0或多个空格

“trailing”空格使用正向前瞻,因此它不包括在匹配中,因此您不需要去掉尾随空格


谢谢!你知道我需要做什么来排除后面跟“of”一词的部分吗?例如“另一本书的第1节”。“的”倾向于表明它是对文档外部的引用。@如果我的回答回答了你原来的问题,请考虑接受/接受ITYES,它回答了我原来的问题!但编辑没有帮助,它只排除了78之后的(1),而没有其他内容(例如输出:第21(1)、54(2)、78'节)
Sections?( *\d+((\(\d+\))*,?(?= *))*)+