Позиционирующие подстроки в Python - PullRequest
0 голосов
/ 28 июля 2010

Как бы вы проанализировали ['i386', 'x86_64'] из строки, такой как '-foo 23 -bar -arch ppc -arch i386 -isysroot / -fno-strict-aliasing -fPIC'?

>>> my_arch_parse_function('-foo 23 -bar -arch i386 -arch x86_64 -isysroot /  -fno-strict-aliasing -fPIC')
>>> ['i386', 'x86_64']

Можно ли это сделать с помощью регулярных выражений или только с использованием таких модулей, как PyParsing, или вручную разделить и выполнить итерации пораскалывает?

Предположение: -arch VAL сгруппированы вместе.

Ответы [ 6 ]

4 голосов
/ 28 июля 2010

Почему бы не использовать модули анализа аргументов?optparse в Python 2.6 (и 3.1) и argparse в Python 2.7 (и 3.2).

РЕДАКТИРОВАТЬ: Если подумать, это не так просто, как кажется, поскольку вам, возможно, придется определить все аргументы, которые вы, вероятночтобы увидеть (не уверен, что эти модули имеют механизм захвата).Я оставлю здесь ответ, потому что это может сработать, но возьмите его с крошкой соли.

3 голосов
/ 28 июля 2010

Regex: (?<=-arch )[^ ]+

>>> re.findall( r"(?<=-arch )([^ ]+)", r"'-foo 23 -bar -arch ppc -arch i386 -isysroot -fno-strict-aliasing -fPIC'" )
['ppc', 'i386']

Произвольный пробел

>>> foo = re.compile( r"(?<=-arch)\s+[^\s]+" )
>>> [ str.strip() for str in re.findall( foo, r"'-foo 23 -bar -arch ppc -arch i386 -isysroot -fno-strict-aliasing -fPIC'" ) ]
['ppc', 'i386']

PS В этой строке нет x86_64, и вы пытаетесь различить -arch ppc и -arch i386

2 голосов
/ 28 июля 2010

Считаете ли вы решение без регулярных выражений? Simpler:

>>> def my_arch_parse_function(s):
...     args = s.split()
...     idxs = (i+1 for i,v in enumerate(args) if v == '-arch')
...     return [args[i] for i in idxs]
...     
... 
>>> s='-foo 23 -bar -arch ppc -arch i386 -isysroot / -fno-strict-aliasing -fPIC'
>>> my_arch_parse_function(s)
['ppc', 'i386']
0 голосов
/ 28 июля 2010

Ручная работа с Python2.6 Я уверен, что вы или библиотека можете сделать лучше.

inp = '-foo 23 -bar -arch ppc -arch i386 -isysroot / -fno-strict-aliasing -fPIC'.split()
dct = {}
noneSet = set([None])

flagName = None
values = []
for param in inp:
    if param.startswith('-'):
        flagName = param
        if flagName not in dct:
            dct[flagName] = set()
        dct[flagName].add(None)
        continue
    # Else found a value
    dct[flagName].add(param)

print(dct)

result = sorted(dct['-arch'] - noneSet)
print(result)

>>> ================================ RESTART ================================
>>> 
{'-arch': set(['ppc', 'i386', None]), '-isysroot': set([None, '/']), '-fno-strict-aliasing': set([None]), '-fPIC': set([None]), '-foo': set([None, '23']), '-bar': set([None])}
['i386', 'ppc']
>>> 
0 голосов
/ 28 июля 2010

Попробуйте, если хотите регулярное выражение:

arch_regex = re.compile('\s+('+'|'.join(arch_list)+')\s+',re.I)
results = arch_regex.findall(arg_string)

Слишком много регулярных выражений на мой вкус, но это работает. Для дальнейшего использования лучше использовать optparse для анализа параметров командной строки.

0 голосов
/ 28 июля 2010

Отвечая на мой собственный вопрос, я нашел регулярное выражение через этот инструмент :

>>> regex = re.compile("(?P<key>\-arch\s?)(?P<value>[^\s]+?)\s|$")
>>> r = regex.search(string)
>>> r
<_sre.SRE_Match object at 0x8aa59232ae397b10>
>>> regex.match(string)
None

# List the groups found
>>> r.groups()
(u'-arch ', u'ppc')

# List the named dictionary objects found
>>> r.groupdict()
{u'key': u'-arch ', u'value': u'ppc'}

# Run findall
>>> regex.findall(string)
[(u'-arch ', u'ppc'), (u'-arch ', u'i386'), (u'', u'')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...