В вашем регулярном выражении содержится только одна пара круглых скобок (одна группа захвата), поэтому вы получаете только одну группу в своем матче. Если вы используете оператор повторения в группе захвата (+
или *
), группа получает «перезаписывается» каждый раз, когда группа повторяется, что означает, что только последнее совпадение зафиксировано.
В ваш пример здесь, вам, вероятно, лучше использовать .split()
в сочетании с регулярным выражением:
lun_q = 'Lun:\s*(\d+(?:\s+\d+)*)'
s = '''Lun: 0 1 2 3 295 296 297 298'''
r = re.search(lun_q, s)
if r:
luns = r.group(1).split()
# optionally, also convert luns from strings to integers
luns = [int(lun) for lun in luns]
Используйте Систему. Поточная обработка. Класс таймера.
Система. Windows. Формы. Таймер разрабатывается, прежде всего, для использования в единственном потоке обычно поток UI Windows Forms.
существует также Система. Класс таймеров, добавленный вначале в разработке платформы.NET. Однако обычно рекомендуется использовать Систему. Поточная обработка. Класс таймера вместо этого, поскольку это - просто обертка вокруг Системы. Поточная обработка. Таймер так или иначе.
также рекомендуется всегда использовать помехи (совместно использованный в VB.NET) Система. Поточная обработка. Таймер, если Вы разрабатываете службу Windows и требуете, чтобы таймер периодически работал. Это избежит возможно преждевременной сборки "мусора" Вашего объекта - таймера.
Вот пример таймера в консольном приложении:
using System;
using System.Threading;
public static class Program
{
public static void Main()
{
Console.WriteLine("Main thread: starting a timer");
Timer t = new Timer(ComputeBoundOp, 5, 0, 2000);
Console.WriteLine("Main thread: Doing other work here...");
Thread.Sleep(10000); // Simulating other work (10 seconds)
t.Dispose(); // Cancel the timer now
}
// This method's signature must match the TimerCallback delegate
private static void ComputeBoundOp(Object state)
{
// This method is executed by a thread pool thread
Console.WriteLine("In ComputeBoundOp: state={0}", state);
Thread.Sleep(1000); // Simulates other work (1 second)
// When this method returns, the thread goes back
// to the pool and waits for another task
}
}
Из книги CLR Через C# Jeff Richter. По тому, как эта книга описывает объяснение позади 3 типов таймеров в Главе 23, настоятельно рекомендованной.
Вот код для создания простого вторая галочка таймера:
using System;
using System.Threading;
class TimerExample
{
static public void Tick(Object stateInfo)
{
Console.WriteLine("Tick: {0}", DateTime.Now.ToString("h:mm:ss"));
}
static void Main()
{
TimerCallback callback = new TimerCallback(Tick);
Console.WriteLine("Creating timer: {0}\n",
DateTime.Now.ToString("h:mm:ss"));
// create a one second timer tick
Timer stateTimer = new Timer(callback, null, 0, 1000);
// loop here forever
for (; ; )
{
// add a sleep for 100 mSec to reduce CPU usage
Thread.Sleep(100);
}
}
}
И вот получающийся вывод:
c:\temp>timer.exe
Creating timer: 5:22:40
Tick: 5:22:40
Tick: 5:22:41
Tick: 5:22:42
Tick: 5:22:43
Tick: 5:22:44
Tick: 5:22:45
Tick: 5:22:46
Tick: 5:22:47
РЕДАКТИРОВАНИЕ: Это никогда не хорошая идея добавить твердые циклы вращения в код, поскольку они используют циклы ЦП ни для какого усиления. В этом случае тот цикл был добавлен только, чтобы мешать приложению закрыться, позволив действиям потока наблюдаться. Но ради правильности и уменьшать использование ЦП простой вызов Сна был добавлен к тому циклу.
Можно также использовать собственные механизмы синхронизации, если бы Вы хотите немного больше управления, но возможно меньше точности и больше кода/сложности, но я все еще рекомендовал бы таймер. Используйте это хотя, если необходимо управлять фактическим потоком синхронизации:
private void ThreadLoop(object callback)
{
while(true)
{
((Delegate) callback).DynamicInvoke(null);
Thread.Sleep(5000);
}
}
был бы Ваш поток синхронизации (измените это для остановки, когда reqiuired, и в любом временном интервале Вы хотите).
и использовать/начинать Вас может сделать:
Thread t = new Thread(new ParameterizedThreadStart(ThreadLoop));
t.Start((Action)CallBack);
Обратный вызов является Вашим пустым методом без параметров, который Вы хотите, зашел в каждый интервал. Например:
private void CallBack()
{
//Do Something.
}