仅当字符串不包含A但包含B时,正则表达式多行匹配

时间:2019-03-24 00:46:58

标签: regex

匹配一个多行字符串,该行在一行中不包含A,但在另一行中包含B。

困难的部分是文件包含多个这些多行构造。

最简单的部分是,如果文件包含无效的组,则正则表达式仅应返回true / false(找到/未找到)。

在我的示例中,仅当story(...)包含bar但不包含foo时,我才应该匹配它。 stuff..是可选的,它可以是0或多行随机词。

文件错误的示例:

story(
  stuff..,
  foo,
  stuff..,
  bar,
)

story(
  stuff..,
  bar,
)         // <-- this file is bad because of this story

优质文件示例:

story(
  stuff..,
  foo,
  stuff..,
  bar,
)

story(
  stuff..,
  foo,
  stuff..,
  bar,
)

// no matches found here, the file is good

甚至可以用正则表达式来做到这一点吗?如果是这样,它将在这里工作:https://regex-golang.appspot.com/assets/html/index.html

1 个答案:

答案 0 :(得分:1)

因此,为了演示一种使用Python的肮脏解决方案,应该可以做到这一点

>>> string_1 = '''story(
  foo,
  stuff,
  bar,
)

story(
  stuff,
  bar,
)   '''




>>> string_2 = '''story(
  foo,
  stuff,
  bar,
)

story(
  foo,
  stupp,
  bar,
)'''





>>> def bad_file(string):
        import re
        matches = re.findall('story\([\S\s]*?foo[\S\s]*?bar[\S\s]*?\)|(story\([\S\s]*?bar[\S\s]*?\))', string)
        #matches = re.findall('story\([\S\s]*?foo[\S\s]*?bar[\S\s]*?\)|(story\([\S\s]*?\))', string)
        for i in range(len(matches)):
            if matches[i] != '':
                print('Bad File because of:\n')
                print(matches[i])
                print('\n'*2)
                print('List of bad matches:')
                return matches
            if i == (len(matches)) -1:
                print('Good File')


#Output
>>> bad_file(string_1)
Bad File


>>> bad_file(string_2)
Good File