regsub.py :  » Mobile » Python-for-PalmOS » Python-1.5.2+reduced-1.0 » Lib » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Mobile » Python for PalmOS 
Python for PalmOS » Python 1.5.2 reduced 1.0 » Lib » regsub.py
"""Regexp-based split and replace using the obsolete regex module.

This module is only for backward compatibility.  These operations
are now provided by the new regular expression module, "re".

sub(pat, repl, str):        replace first occurrence of pattern in string
gsub(pat, repl, str):       replace all occurrences of pattern in string
split(str, pat, maxsplit):  split string using pattern as delimiter
splitx(str, pat, maxsplit): split string using pattern as delimiter plus
                            return delimiters
"""

import regex


# Replace first occurrence of pattern pat in string str by replacement
# repl.  If the pattern isn't found, the string is returned unchanged.
# The replacement may contain references \digit to subpatterns and
# escaped backslashes.  The pattern may be a string or an already
# compiled pattern.

def sub(pat, repl, str):
  prog = compile(pat)
  if prog.search(str) >= 0:
    regs = prog.regs
    a, b = regs[0]
    str = str[:a] + expand(repl, regs, str) + str[b:]
  return str


# Replace all (non-overlapping) occurrences of pattern pat in string
# str by replacement repl.  The same rules as for sub() apply.
# Empty matches for the pattern are replaced only when not adjacent to
# a previous match, so e.g. gsub('', '-', 'abc') returns '-a-b-c-'.

def gsub(pat, repl, str):
  prog = compile(pat)
  new = ''
  start = 0
  first = 1
  while prog.search(str, start) >= 0:
    regs = prog.regs
    a, b = regs[0]
    if a == b == start and not first:
      if start >= len(str) or prog.search(str, start+1) < 0:
        break
      regs = prog.regs
      a, b = regs[0]
    new = new + str[start:a] + expand(repl, regs, str)
    start = b
    first = 0
  new = new + str[start:]
  return new


# Split string str in fields separated by delimiters matching pattern
# pat.  Only non-empty matches for the pattern are considered, so e.g.
# split('abc', '') returns ['abc'].
# The optional 3rd argument sets the number of splits that are performed.

def split(str, pat, maxsplit = 0):
  return intsplit(str, pat, maxsplit, 0)

# Split string str in fields separated by delimiters matching pattern
# pat.  Only non-empty matches for the pattern are considered, so e.g.
# split('abc', '') returns ['abc']. The delimiters are also included
# in the list.
# The optional 3rd argument sets the number of splits that are performed.


def splitx(str, pat, maxsplit = 0):
  return intsplit(str, pat, maxsplit, 1)
  
# Internal function used to implement split() and splitx().

def intsplit(str, pat, maxsplit, retain):
  prog = compile(pat)
  res = []
  start = next = 0
  splitcount = 0
  while prog.search(str, next) >= 0:
    regs = prog.regs
    a, b = regs[0]
    if a == b:
      next = next + 1
      if next >= len(str):
        break
    else:
      res.append(str[start:a])
      if retain:
        res.append(str[a:b])
      start = next = b
      splitcount = splitcount + 1
      if (maxsplit and (splitcount >= maxsplit)):
          break
  res.append(str[start:])
  return res


# Capitalize words split using a pattern

def capwords(str, pat='[^a-zA-Z0-9_]+'):
  import string
  words = splitx(str, pat)
  for i in range(0, len(words), 2):
    words[i] = string.capitalize(words[i])
  return string.joinfields(words, "")


# Internal subroutines:
# compile(pat): compile a pattern, caching already compiled patterns
# expand(repl, regs, str): expand \digit escapes in replacement string


# Manage a cache of compiled regular expressions.
#
# If the pattern is a string a compiled version of it is returned.  If
# the pattern has been used before we return an already compiled
# version from the cache; otherwise we compile it now and save the
# compiled version in the cache, along with the syntax it was compiled
# with.  Instead of a string, a compiled regular expression can also
# be passed.

cache = {}

def compile(pat):
  if type(pat) <> type(''):
    return pat    # Assume it is a compiled regex
  key = (pat, regex.get_syntax())
  if cache.has_key(key):
    prog = cache[key]  # Get it from the cache
  else:
    prog = cache[key] = regex.compile(pat)
  return prog


def clear_cache():
  global cache
  cache = {}


# Expand \digit in the replacement.
# Each occurrence of \digit is replaced by the substring of str
# indicated by regs[digit].  To include a literal \ in the
# replacement, double it; other \ escapes are left unchanged (i.e.
# the \ and the following character are both copied).

def expand(repl, regs, str):
  if '\\' not in repl:
    return repl
  new = ''
  i = 0
  ord0 = ord('0')
  while i < len(repl):
    c = repl[i]; i = i+1
    if c <> '\\' or i >= len(repl):
      new = new + c
    else:
      c = repl[i]; i = i+1
      if '0' <= c <= '9':
        a, b = regs[ord(c)-ord0]
        new = new + str[a:b]
      elif c == '\\':
        new = new + c
      else:
        new = new + '\\' + c
  return new


# Test program, reads sequences "pat repl str" from stdin.
# Optional argument specifies pattern used to split lines.

def test():
  import sys
  if sys.argv[1:]:
    delpat = sys.argv[1]
  else:
    delpat = '[ \t\n]+'
  while 1:
    if sys.stdin.isatty(): sys.stderr.write('--> ')
    line = sys.stdin.readline()
    if not line: break
    if line[-1] == '\n': line = line[:-1]
    fields = split(line, delpat)
    if len(fields) <> 3:
      print 'Sorry, not three fields'
      print 'split:', `fields`
      continue
    [pat, repl, str] = split(line, delpat)
    print 'sub :', `sub(pat, repl, str)`
    print 'gsub:', `gsub(pat, repl, str)`
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.