正则表达式中的可选括号

时间:2016-05-31 18:41:36

标签: python regex

在python中使用以下字符串

arr.length-1

我尝试创建一个regit表达式,将部分,标题和页码分为3组。到目前为止我已经

for (int i = arr.length - 1; i >= 0; i--) {
            System.out.println(arr[i] + " ");
        }

可以处理除(RFI)以外的所有情况。我怎么能抓住这个呢? 注意:有时字符串可能包含我不想要的小写子部分。这就是[^ a-z]存在的原因。此外,RFI可能并不总是括号中的文本。

更新

1 - GENERAL 1

    1.1 RELATED DOCUMENTS   1

    1.2 SUMMARY 1

    1.3 DEFINITIONS 1

    1.4 INFORMATIONAL SUBMITTALS    2

    1.5 GENERAL COORDINATION PROCEDURES 2

    1.6 COORDINATION DRAWINGS   3

    1.7 REQUESTS FOR INFORMATION (RFIs) 4

    1.8 PROJECT MEETINGS    6

2 个答案:

答案 0 :(得分:2)

您的字符串中主要包含三个部分。

  

首先是主要由数字后跟小数和数字

组成的部分      

其次是页码的任何内容。这主要从单词

开始      

第三个是最后的页码,通常是位数

您的正则表达式包含太多不需要的替换。 所以你可以使用这个正则表达式

^\s*(\b\d+(?:[.]\d+)?)\W+(.*?)\s*(\b\d+\b)$
    <---------------->   <--->   <------->
        Section         Content  Page Number

<强> Regex Demo

如果子部分可以包含1.1.1等值,则可以使用

^\s*(\b\d+(?:[.]\d+)*)\W+(.*?)\s*(\b\d+\b)$

正则表达式细分

  

\bword boundary

     

\W相当于[^\w],而[^A-Za-z0-9_]依次为^(请注意 ^ #start of string \s* #Match any spaces in starting ( \b #word boundary \d+ #Match digits (?:[.]\d+)* #Non-capturing group to match . followed by digits any #number of times(due to *). It matches after . like .1.1 etc ) \W+ #Match any non word character (.*?) #Match anything upto page number given in next \s* #Match spaces if there (\b\d+\b) #Match page numbers in last(due to $). $ #End of string 表示匹配除字符类中的内容之外的任何内容)

   //change i from arr.length to i = arr.length-1
   //change i>0 to i>=0
   //change arr[i-1] to arr[i]
    for(int i = arr.length-1; i >= 0;i--){


        System.out.print(arr[i ]+" ");


    }

答案 1 :(得分:0)

我推荐这样的东西

    ^\s*([\d.]+)[\s-]*\s+(.+?)\s+(\d+)$

既然你说你在使用python,那么当你提到评论之类的东西时,这会为你提供更多的能力。例如:

    ^\s*(?#Section)([\d.]+)[\s-]*\s+(?#Title)(.+?)\s+(?#Page)(\d+)$

正则表达式是超级强大的,但如果你是新手还是刚刚练习,通常是不可读的。在这些情况下,评论是天赐之物!

完整的实现如下所示:

    re.search(r'^\s*(?#Section)([\d.]+)[\s-]*\s+(?#Title)(.+?)\s+(?#Page)(\d+)$', input_string, re.M)

其中re.M表示它应该在MULTILINE模式下运行,使^匹配每行的开头而不是整个输入的开头。 $和行尾/输入相同