卡在python中编写正则表达式

时间:2018-11-27 00:05:42

标签: python regex

我是一个初学者,并且坚持用python编写正则表达式。我编写了此正则表达式来检查给定输入中是否存在匹配项。这是名为regexs的文件中的代码片段:

regexp = '[-]?\d+(\.\d+)?[\', ][-]?\d+(\.\d\d+)?'
num = re.compile(regexp, re.IGNORECASE)

我正在使用此正则表达式在测试文件中进行测试:

def full_match(regex, text):
    """
    Gives a list of all complete matches
    """
    ans = []
    for match in regex.finditer(text):
        ans.append(match.group(0))

    return ans

tn = full_match(num, text)
print(
    'num:',
    '5,9' in tn,
    '5.0, 9.0' in tn,
    '-7.4159265 1110' in tn,
    '3.4.5, 1' not in tn,
    '1 2' not in tn,
    '3 - 4' not in tn
)
for match in regexs.num.finditer(text):
    if match.group(0) == '5,9':
        print(' match1:', '5' in match.groups(), '9' in match.groups())
    if match.group(0) == '-7.4159265 1110':
        print(' match2:', '-7.4159265' in match.groups(), '1110' in match.groups())

我执行上面的代码得到的输出是:

  

num:真假真真真真

     

match1:错误错误

     

match2:错误错误

问题是我需要获取True作为所有情况的输出。但是我的正则表达式在某些情况下会失败。 请帮助解决此问题。 TIA。

1 个答案:

答案 0 :(得分:0)

首先,如果您指定一个带有反斜杠的正则表达式, 使用原始字符串(r'...')。否则你必须加倍 反斜杠。

要匹配所有情况,请使用以下正则表达式:

-?\d+(?:\.\d+)* ?[\',-]? ?\d+(?:\.\d+)?

与您的正则表达式不同:

  • 将初始[-]更改为普通-。当您需要方括号时 尝试匹配任何个提供的字符(不是一个)。
  • ?:之后的2个地方添加(。我认为没有必要匹配 这些“点数字”块作为捕获组。
  • 将第一个?之后的(...)更改为*。这样你会匹配 这样的字符串,例如3.4.5两个“点数字”块)。
  • 将“中央部分”更改为:?[\',-]? ?(可选空格,然后 撇号,逗号或减号(也是可选的),然后再次 可选空间)。
  • \d之前删除\d+

请注意,-[之间的最后一个(或第一个)位置的]表示 本身,因此无需使用反斜杠将其转义。

其他简化:如果将正则表达式字符串定义为r"..."(定界 (用引号引起来),则无需转义撇号。 然后正则表达式可以是:

r"-?\d+(?:\.\d+)* ?[',-]? ?\d+(?:\.\d+)?"