我正在尝试创建一个脚本,用于搜索output.txt中只有特定长度数字的数字字符串。
示例output.txt:
12345678
77777
12123887
当我使用时:
import re
f = open('output.txt', 'r')
strings = re.findall(r'(\d{5,5})', f.read())
print strings
我只想输出:77777
而不是:
12345
77777
12123
答案 0 :(得分:2)
非正则表达式解决方案。这可以通过获取每个名称的长度并通过验证isdigit
得到感兴趣的名称来完成:
with open('output.txt') as f:
file_names = [name.strip() for name in f.readlines() if name.strip().isdigit() and len(name.strip()) == 5]
print(file_names)
答案 1 :(得分:2)
使用^(\d{5})$
和re.MULTILINE
>>> import re
>>> data = '''12345678
77777
12123887'''
>>> p = re.compile(r'^(\d{5})$', re.MULTILINE)
>>> re.findall(p, data)
['77777']
>>>
答案 2 :(得分:1)
只需指定您期望的边界:您希望5位数字不被其他数字包围:
with open("output.txt", "r") as f:
strings=re.findall(r'\b(\d{5})\b', f.read())
print strings
答案 3 :(得分:1)
line = f.read()
line.rstrip()
if len(line) == 5 and not re.match('[^\d]', line):
print(line)
len
非常快,您可以保持正则表达式尽可能简单。
答案 4 :(得分:1)
这应该适合你..
f = open('input.txt', 'r')
file_str = f.read()
for line in str.split(file_str):
if len(line) == 5: # you can manipulate the number 5 as you like .
print(line)
答案 5 :(得分:0)
如果您想使用基于正则表达式的解决方案,则应使用\b
:
strings = re.findall(r'\b\d{5}\b', f.read()) # Returns ['77777']
匹配空字符串,但仅匹配单词的开头或结尾。单词被定义为Unicode字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字的非下划线Unicode字符表示。请注意,正式地,
\b
被定义为\w
和\W
字符之间的边界(反之亦然),或\w
与字符串的开头/结尾之间的边界。这意味着r'\bfoo\b'
匹配'foo'
,'foo.'
,'(foo)'
,'bar foo baz'
但不匹配'foobar'
或'foo3'
。