获取除数字之外的任何字符

时间:2012-05-29 18:03:42

标签: python regex

我正在尝试搜索一个包含6位数的字符串,但不会再搜索其他字符。这是我使用的正则表达式\d{6}[^\d]由于某种原因,它没有捕获\d{6}捕获的数字。

更新

现在我正在使用正则表达式(\ d {6} \ D *)$。但无论如何我都无法工作。

更新2 - 解决方案

我当然应该将\ d {6}与括号分组。卫生署!否则,它包括无数字,并尝试与之相关。

更新结束

我想要实现的目标(作为一个相当肮脏的黑客)是在以下任一格式的openoffice文档的标题中找到一个日期字符串:YYMMDDYYYY-MM-DD或{{ 1}}。如果它找到其中一个(并且只有一个),则将该文件的mtime和atime设置为该日期。尝试在标头中使用YYYYMMDD在/ tmp中创建一个odt文件并运行此脚本(要下载的示例文件:http://db.tt/9aBaIqqa)。它不应该根据我的测试改变mtime / atime。但是如果你删除下面脚本中的\ D,它会改变它们。

这是我的全部资料来源:

100101

3 个答案:

答案 0 :(得分:1)

您可以使用\D(大写字母D)来匹配任何非数字字符。

正则表达式:

\d{6}\D

原始字符串:(你确定你正确地转义了字符串吗?)

ex = r"\d{6}\D"

的字符串:

ex = '\\d{6}\\D'

答案 1 :(得分:1)

请改为尝试:

r'(\d{6}\D*)$'

(六位数后跟0或更多非数字)。

编辑:添加了“必须匹配字符串结尾”限定符。

Edit2:哦,为了皮特的缘故:

import re

test_strings = [
    ("12345", False),
    ("123456", True),
    ("1234567", False),
    ("123456abc", True),
    ("123456ab9", False)
]

outp = [
    "  good, matched",
    "FALSE POSITIVE",
    "FALSE NEGATIVE",
    "  good, no match"
]

pattern = re.compile(r'(\d{6}\D*)$')
for s,expected in test_strings:
    res = pattern.match(s)
    print outp[2*(res is None) + (expected is False)]

返回

  good, no match
  good, matched
  good, no match
  good, matched
  good, no match

答案 2 :(得分:0)

我非常愚蠢。如果我在搜索结尾添加\D,搜索当然会返回我也不想要的任何数字。我不得不在我真正想要的部分添加括号。因为在循环之后没有使用简单的print语句来捕获它,我觉得非常愚蠢。我真的需要更频繁地编码。