我正在尝试搜索一个包含6位数的字符串,但不会再搜索其他字符。这是我使用的正则表达式\d{6}[^\d]
由于某种原因,它没有捕获\d{6}
捕获的数字。
现在我正在使用正则表达式(\ d {6} \ D *)$。但无论如何我都无法工作。
我当然应该将\ d {6}与括号分组。卫生署!否则,它包括无数字,并尝试与之相关。
我想要实现的目标(作为一个相当肮脏的黑客)是在以下任一格式的openoffice文档的标题中找到一个日期字符串:YYMMDD
,YYYY-MM-DD
或{{ 1}}。如果它找到其中一个(并且只有一个),则将该文件的mtime和atime设置为该日期。尝试在标头中使用YYYYMMDD
在/ tmp中创建一个odt文件并运行此脚本(要下载的示例文件:http://db.tt/9aBaIqqa)。它不应该根据我的测试改变mtime / atime。但是如果你删除下面脚本中的\ D,它会改变它们。
这是我的全部资料来源:
100101
答案 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语句来捕获它,我觉得非常愚蠢。我真的需要更频繁地编码。