我有两个字符串:
num = '#123'
line = '#123 random text generator #111 #222 #333'
我希望获得格式'#xyz' if num == first number in line.
我使用正则表达式来获取第一个数字(#123)
:
re.findall(r'[#]\d{3,10}', line)
我尝试通过以下方式测试这种情况:
if re.findall(r'[#]\d{3,10}', line)[:1] == num:
我试图将re.findall转换为参数并打印其长度和类型,并且它表示长度为0且类型列表。这让我感到困惑,因为[:1]应该给我找到它正确的'#123'字符串?似乎列表是空的但我无法弄清楚原因。
更具体地说,我的代码有matrix = [['#123'] ['#234'] ['#345'] ['#666']]
。
def test(matrix,txt):
for num_group in matrix:
print num_group
for num in num_group:
for line in txt:
if re.findall(r'[#]\d{3,10}', line)[:1] == num:
print "found some more numbers in the line number!"
print line
more_nums = re.findall(r'[#]\d{3,10}', line)[1:]
matrix[num_group].append(nums)
因此,我的最终结果应将#111 #222
和#333
附加到包含matrix[0]
的{{1}}。
答案 0 :(得分:1)
你可以通过python string inbuilt方法'startswith'检查然后你可以在那里使用一些逻辑,这是我的方法:
import re
pattern=r'#\d+'
num = '#123'
line = '#123 random text generator #111 #222 #333'
matrix = [['#123'],['#234'],['#345'],['#666']]
if line.startswith(num):
match=re.findall(pattern,line)
for index,value in enumerate(matrix):
if match[0] in value:
value.extend(match[1:])
print(matrix)
输出:
[['#123', '#111', '#222', '#333'], ['#234'], ['#345'], ['#666']]
编辑:
如你所说,你想限制只搜索num的搜索,那么你可以在上面的代码之前添加一些逻辑,这里是更新的代码:
import re
pattern=r'#\d+'
num = '#123'
line = '#123 random text generator #111 #222 #333'
matrix = [['#123'],['#234'],['#345'],['#666']]
if len(line.split()[0])==len(num):
if line.startswith(num):
match=re.findall(pattern,line)
for index,value in enumerate(matrix):
if match[0] in value:
value.extend(match[1:])
print(matrix)
测试案例1:
line = '#1234 random text generator #111 #222 #333' #not exact string
输出:
[['#123'], ['#234'], ['#345'], ['#666']] #no effect
测试案例2:
line = '#1234 random text generator #111 #222 #333' #exact string
输出:
[['#123', '#111', '#222', '#333'], ['#234'], ['#345'], ['#666']]