В C # это простой способ использовать System.Diagnostics для работы. How!?
В принципе, каждая командная команда является файлом .exe, поэтому вы можете запустить ее в отдельном процессе.
Некоторое число:
использование System.Diagnostics; static void Main () {Process batch; batch = Process.Start ("ping.exe", "localhost"); batch.WaitForExit (); batch.Close (); batch = Process.Start ("choice.exe", ""); batch.WaitForExit (); batch.Close (); batch = Process.Start ("ping.exe", "localhost -n 10"); batch.WaitForExit (); batch.Close (); }
Если вы не хотите запускать каждую команду в отдельном процессе, решение выполняется с простым перенаправлением потока.
ProcessStartInfo startInfo = new ProcessStartInfo (); startInfo.FileName = @ "cmd.exe"; // Укажите имя exe. startInfo.UseShellExecute = false; startInfo.ErrorDialog = false; startInfo.RedirectStandardInput = true; // // Запустите процесс. // Process process = Process.Start (startInfo); string [] batchFile = {"ping localhost", "ping google.com -n 10", "exit"}; int cmdIndex = 0; while (! process.HasExited) {if (process.Threads.Count == 1 & amp; cmdIndex & lt; batchFile.Length) {process.StandardInput.WriteLine (batchFile [cmdIndex ++]); }}
Если вы хотите извлечь только положительные целые числа, попробуйте следующее:
>>> str = "h3110 23 cat 444.4 rabbit 11 2 dog"
>>> [int(s) for s in str.split() if s.isdigit()]
[23, 11, 2]
Я бы сказал, что это лучше, чем пример регулярного выражения по трем причинам. Во-первых, вам не нужен другой модуль; во-вторых, это более читаемо, потому что вам не нужно разбирать мини-язык регулярных выражений; и, в-третьих, он быстрее (и, скорее всего, более pythonic):
python -m timeit -s "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "[s for s in str.split() if s.isdigit()]"
100 loops, best of 3: 2.84 msec per loop
python -m timeit -s "import re" "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "re.findall('\\b\\d+\\b', str)"
100 loops, best of 3: 5.66 msec per loop
Это не будет распознавать поплавки, отрицательные целые числа или целые числа в шестнадцатеричном формате. Если вы не можете принять эти ограничения, ответ slim ниже выполнит трюк.
Это более чем немного поздно, но вы также можете расширить выражение регулярного выражения для учета научной нотации.
import re
# Format is [(<string>, <expected output>), ...]
ss = [("apple-12.34 ba33na fanc-14.23e-2yapple+45e5+67.56E+3",
['-12.34', '33', '-14.23e-2', '+45e5', '+67.56E+3']),
('hello X42 I\'m a Y-32.35 string Z30',
['42', '-32.35', '30']),
('he33llo 42 I\'m a 32 string -30',
['33', '42', '32', '-30']),
('h3110 23 cat 444.4 rabbit 11 2 dog',
['3110', '23', '444.4', '11', '2']),
('hello 12 hi 89',
['12', '89']),
('4',
['4']),
('I like 74,600 commas not,500',
['74,600', '500']),
('I like bad math 1+2=.001',
['1', '+2', '.001'])]
for s, r in ss:
rr = re.findall("[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?", s)
if rr == r:
print('GOOD')
else:
print('WRONG', rr, 'should be', r)
Дает все хорошее!
Кроме того, вы можете посмотрите на встроенное регулярное выражение AWS Glue
s = "4"
не возвращает совпадений. Можно ли отредактировать, чтобы позаботиться об этом?
– batFINGER
10 October 2016 в 13:03
[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?
- настолько глупо от меня ... как я мог не думать об этом?
– Przemek D
4 October 2017 в 11:52
Лучший вариант, который я нашел, ниже. Он будет извлекать число и может устранить любой тип char.
def extract_nbr(input_str):
if input_str is None or input_str == '':
return 0
out_number = ''
for ele in input_str:
if ele.isdigit():
out_number += ele
return float(out_number)
# extract numbers from garbage string:
s = '12//n,_@#$%3.14kjlw0xdadfackvj1.6e-19&*ghn334'
newstr = ''.join((ch if ch in '0123456789.-e' else ' ') for ch in s)
listOfNumbers = [float(i) for i in newstr.split()]
print(listOfNumbers)
[12.0, 3.14, 0.0, 1.6e-19, 334.0]
Я бы использовал regexp:
>>> import re
>>> re.findall(r'\d+', 'hello 42 I\'m a 32 string 30')
['42', '32', '30']
Это также соответствует 42 из bla42bla
. Если вам нужны только числа, ограниченные границами слов (пробел, период, запятая), вы можете использовать \ b:
>>> re.findall(r'\b\d+\b', 'he33llo 42 I\'m a 32 string 30')
['42', '32', '30']
. В итоге список строк вместо списка строк:
>>> [int(s) for s in re.findall(r'\b\d+\b', 'he33llo 42 I\'m a 32 string 30')]
[42, 32, 30]
int
над ним, и все готово. +1 особенно для последней части. Я бы предложил исходные строки (r'\b\d+\b' == '\\b\\d+\\b'
).
– user
27 November 2010 в 01:06
int_list = [int(s) for s in re.findall('\\d+', 'hello 12 hi 89')]
– GreenMatt
27 November 2010 в 01:19
map
.
– Seth Johnson
27 November 2010 в 02:23
Что делать, если у вас есть пара этих строк в текстовом файле, и вы хотите сохранить их в каждой строке?
Я предполагаю, что вы хотите, чтобы поплавки не были целыми, поэтому я бы сделал что-то вроде этого:
l = []
for t in s.split():
try:
l.append(float(t))
except ValueError:
pass
Обратите внимание, что некоторые другие решения, размещенные здесь, не работают с отрицательными номерами:
>>> re.findall(r'\b\d+\b', 'he33llo 42 I\'m a 32 string -30')
['42', '32', '30']
>>> '-3'.isdigit()
False
float
на int
.
– Hugo
2 June 2015 в 12:34
Поскольку ни один из них не занимался финансовыми цифрами реального мира в документах Excel и Word, которые мне нужно было найти, вот моя вариация. Он обрабатывает ints, float, отрицательные числа, номера валют (потому что он не отвечает на split), и имеет возможность отбрасывать десятичную часть и просто возвращать ints или возвращать все.
Он также обрабатывает систему чисел индийских лаков, где запятые появляются нерегулярно, а не каждые 3 числа друг от друга.
Он не обрабатывает научную нотацию или отрицательные числа, помещенные в круглые скобки в бюджетах - появится положительны.
Он также не отображает даты. Есть лучшие способы поиска дат в строках.
import re
def find_numbers(string, ints=True):
numexp = re.compile(r'[-]?\d[\d,]*[\.]?[\d{2}]*') #optional - in front
numbers = numexp.findall(string)
numbers = [x.replace(',','') for x in numbers]
if ints is True:
return [int(x.replace(',','').split('.')[0]) for x in numbers]
else:
return numbers
Этот ответ также содержит случай, когда число плавает в строке
def get_first_nbr_from_str(input_str):
'''
:param input_str: strings that contains digit and words
:return: the number extracted from the input_str
demo:
'ab324.23.123xyz': 324.23
'.5abc44': 0.5
'''
if not input_str and not isinstance(input_str, str):
return 0
out_number = ''
for ele in input_str:
if (ele == '.' and '.' not in out_number) or ele.isdigit():
out_number += ele
elif out_number:
break
return float(out_number)
Я удивлен, увидев, что никто еще не упомянул об использовании itertools.groupby
в качестве альтернативы для достижения этого.
Вы можете использовать itertools.groupby()
вместе с str.isdigit()
для извлечения чисел из строки как:
from itertools import groupby
my_str = "hello 12 hi 89"
l = [int(''.join(i)) for is_digit, i in groupby(my_str, str.isdigit) if is_digit]
Величина, удерживаемая l
, будет:
[12, 89]
PS: Это просто для иллюстрации, чтобы показать, что в качестве альтернативы мы могли бы также использовать groupby
для достижения этого. Но это не рекомендуемое решение. Если вы хотите достичь этого, вы должны использовать принятый ответ fm на основе g3] на основе использования списка с параметром str.isdigit
в качестве фильтра.
Если вы знаете, что в строке будет только одно число, то есть «привет 12 привет», вы можете попробовать фильтр.
Например:
In [1]: int(filter(str.isdigit, '200 grams'))
Out[1]: 200
In [2]: int(filter(str.isdigit, 'Counters: 55'))
Out[2]: 55
In [3]: int(filter(str.isdigit, 'more than 23 times'))
Out[3]: 23
Но будьте осторожно !!! :
In [4]: int(filter(str.isdigit, '200 grams 5'))
Out[4]: 2005
TypeError: int() argument must be a string, a bytes-like object or a number, not 'filter'
- исправил его, используя int("".join(filter(str.isdigit, '200 grams')))
– Kent Munthe Caspersen
9 April 2018 в 08:56
Я искал решение для удаления строковых масок, в частности из бразильских телефонов, этот пост не ответил, но вдохновил меня. Это мое решение:
>>> phone_number = '+55(11)8715-9877'
>>> ''.join([n for n in phone_number if n.isdigit()])
'551187159877'
Использование Regex ниже - это путь
lines = "hello 12 hi 89"
import re
output = []
line = lines.split()
for word in line:
match = re.search(r'\d+.?\d*', word)
if match:
output.append(float(match.group()))
print (output)
@jmnas, мне понравился ваш ответ, но он не нашел поплавков. Я работаю над скриптом для анализа кода, идущего на станцию с ЧПУ, и мне нужно найти как размеры X, так и Y, которые могут быть целыми числами или плавать, поэтому я адаптировал ваш код к следующему. Это находит int, float с положительными и отрицательными vals. Все еще не находит шестнадцатеричные форматированные значения, но вы можете добавить «x» и «A» через «F» в кортеж num_char
, и я думаю, что он будет анализировать такие вещи, как «0x23AC».
s = 'hello X42 I\'m a Y-32.35 string Z30'
xy = ("X", "Y")
num_char = (".", "+", "-")
l = []
tokens = s.split()
for token in tokens:
if token.startswith(xy):
num = ""
for char in token:
# print(char)
if char.isdigit() or (char in num_char):
num = num + char
try:
l.append(float(num))
except ValueError:
pass
print(l)
[int(s) for s in str.split() if s.isdigit()]
== & gt;[23, 11, 2]
– Chris Morgan 27 November 2010 в 02:48re
. Это общий и мощный инструмент (поэтому вы узнаете что-то очень полезное). Скорость немного не важна при анализе журнала (это не какой-то интенсивный численный решатель), модульre
находится в стандартной библиотеке Python, и это не повредит загрузке. – Ioannis Filippidis 22 April 2014 в 08:27mumblejumble45mumblejumble
, в которых я знал, что есть только один номер. Решение простоint(filter(str.isdigit, your_string))
. – Jonas Lindeløv 20 August 2015 в 09:57int(filter(...))
подниметTypeError: int() argument must be a string...
для Python 3.5, поэтому вы можете использовать обновленную версию:int(''.join(filter(str.isdigit, your_string)))
для извлечения всех цифр в одно целое. – Mark Mishyn 21 March 2017 в 08:51